在我的应用程序中,我允许用户上传他们的 css 样式表,以便他们可以应用于模板。css 写成内部样式表,因为此时我不想将 css 样式表暴露给其他用户。
这为用户在 css 文件中包含恶意代码创造了空间。最初我的计划是转换所有 '<' 和 '>',但这在 css 语法中是必需的。我正在寻求白名单解决方案,因为彻底消除不需要的字符是不可行的。
对这种情况实施安全措施有什么建议吗?
您绝对还应该至少过滤掉 IE 表达式和 FF -moz-binding 属性...两者都可用于使用 css 运行(可能是恶意的)javascript。
这份备忘单包含最明显的 XSS 策略,包括一些 CSS 策略。
最安全的解决方案可能是按照您的建议将其列入白名单(如果可以将用户限制为仅使用列入白名单的属性)。
我实现了一个过滤器,将所有<
字符替换为<
. 原因是 CSS 不需要<
字符;它唯一需要的字符>
是用于子选择器的字符。
这样用户就无法打开标签来编写恶意代码。
我非常乐意考虑任何其他/更好的解决方案。
不允许用户上传 CSS 文件,制作一个根据用户选择的选项动态生成 CSS 文件的界面。您允许的选项。然后你可以制作一个真实的 CSS 文件,或者你可以制作一个基于该配置编写 CSS 的动态应用程序,这样可以避免在服务器上有很多 CSS 文件……这是另一种方法,你不需要检查每一个可能的 XSS 漏洞,比解析 CSS 和拒绝一些危险代码更容易定义允许的内容。
使用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>