在我的应用程序中,我允许用户上传他们的CSS样式表,以便他们可以应用于模板。 css是作为内部样式表编写的,因为此时我不想将css样式表公开给其他用户。
这为用户创建了将恶意代码包含到css文件中的空间。最初我的计划是转换所有'<'和'>',但这在css语法中是必需的。我正在使用白名单解决方案,因为彻底消除不需要的字符是不可行的。
有关实施此方案的安全措施的任何建议吗?
答案 0 :(得分:4)
你绝对应该过滤掉至少IE表达式和FF -moz绑定属性......两者都可以用来运行(潜在的恶意)javascript使用css。
This cheat sheet包含最明显的XSS策略,包括一些CSS策略。
最安全的解决方案可能是您建议的白名单(如果可以限制用户仅使用列入白名单的属性)。
答案 1 :(得分:1)
我实施了一个过滤器,将所有<
个字符替换为<
。原因是CSS不需要<
字符;它需要的唯一字符是用于子选择器的>
。
这样用户就无法打开标签来编写恶意代码。
我非常乐意考虑任何其他/更好的解决方案。
答案 2 :(得分:1)
不允许用户上传CSS文件,根据用户选择的选项创建一个动态生成CSS文件的界面。您允许的选项。然后你可以制作一个fisical CSS文件,或者你可以创建一个动态应用程序谁根据该配置编写CSS,这避免在服务器上有很多CSS文件...它的另一种方法,你不需要检查每个可能的XSS漏洞利用,它比解析CSS和拒绝一些危险的代码更容易定义允许的内容。
答案 3 :(得分:-1)
使用CDATA并转义终止序列(]]>
)。不过,我不确定浏览器的兼容性。
示例(未经测试):
<?PHP
function strReplaceAll($needle, $replacement, $haystack)
{
// Check for infinite loop. (NOT FOOL PROOF!)
if(strpos($replacement, $needle) === FALSE)
return;
$numReplacements = 42;
while($numReplacements)
{
$haystack = str_replace($needle, $replacement, $haystack, &$numReplacements);
}
return $haystack;
}
?>
<style type="text/css">
/*
<![CDATA[
*/
<?PHP echo sstrReplaceAll(']]>', '', $userCss); ?>
/*
]]>
*/
</style>