1

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

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

对这种情况实施安全措施有什么建议吗?

4

4 回答 4

4

您绝对还应该至少过滤掉 IE 表达式和 FF -moz-binding 属性...两者都可用于使用 css 运行(可能是恶意的)javascript。

这份备忘单包含最明显的 XSS 策略,包括一些 CSS 策略。

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

于 2009-03-19T06:50:12.863 回答
1

我实现了一个过滤器,将所有<字符替换为&lt;. 原因是 CSS 不需要<字符;它唯一需要的字符>是用于子选择器的字符。

这样用户就无法打开标签来编写恶意代码。

我非常乐意考虑任何其他/更好的解决方案。

于 2009-03-19T06:35:55.317 回答
1

不允许用户上传 CSS 文件,制作一个根据用户选择的选项动态生成 CSS 文件的界面。您允许的选项。然后你可以制作一个真实的 CSS 文件,或者你可以制作一个基于该配置编写 CSS 的动态应用程序,这样可以避免在服务器上有很多 CSS 文件……这是另一种方法,你不需要检查每一个可能的 XSS 漏洞,比解析 CSS 和拒绝一些危险代码更容易定义允许的内容。

于 2009-03-20T00:50:52.163 回答
-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>
于 2009-03-19T05:54:06.210 回答