如何过滤用户输入css?

时间:2009-03-19 05:51:24

标签: css security filtering

在我的应用程序中,我允许用户上传他们的CSS样式表,以便他们可以应用于模板。 css是作为内部样式表编写的,因为此时我不想将css样式表公开给其他用户。

这为用户创建了将恶意代码包含到css文件中的空间。最初我的计划是转换所有'<'和'>',但这在css语法中是必需的。我正在使用白名单解决方案,因为彻底消除不需要的字符是不可行的。

有关实施此方案的安全措施的任何建议吗?

4 个答案:

答案 0 :(得分:4)

你绝对应该过滤掉至少IE表达式和FF -moz绑定属性......两者都可以用来运行(潜在的恶意)javascript使用css。

This cheat sheet包含最明显的XSS策略,包括一些CSS策略。

最安全的解决方案可能是您建议的白名单(如果可以限制用户仅使用列入白名单的属性)。

答案 1 :(得分:1)

我实施了一个过滤器,将所有<个字符替换为&lt;。原因是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>