关于 JavaScript:
在 Internet Explorer 和一些非常旧的浏览器中,可以将 JavaScript 注入到样式表中。XSS Filter Evasion Cheat Sheet中描述了几种方法来做到这一点。三个主要问题是:
- 背景图像和类似的:
background-image: url('javascript:alert(/XSS/);')
- JavaScript 表达式:
width: expression(alert(/XSS/))
- 确认在 IE 7 中工作
- 加载 .htc 文件:
behavior: url(/evil.htc)
- 确认在 IE 7 到 9 中工作
CSS 的其他问题:
基本上,每个可下载的资源(图像、字体等)都可以占用访问者的网络容量,并可用于运行 CSRF 攻击、监视访问者或在较小的网站上运行 DDOS 攻击。
可能有一些方法可以使用 CSS 来使浏览器崩溃、占用大量内存或在一段时间内以 99% 的速度旋转 CPU。CSS 3 将支持许多您想要禁止的奇怪事物,包括 3d 内容和过渡。
网站的布局可以自由更改。这包括有趣的事情,比如交换搜索位置和密码输入。它可能会使用内嵌样式是不可能的,只是意识到这一点。
关于黑名单:
模式黑名单是一个非常糟糕的主意。编码 CSS 的方法有很多种,但浏览器的做法各不相同。CSS 解析器通常遵循“垃圾输入 - CSS 输出”的原则。此外,需要注意的是,CSS 解析器一般不会因错误而停止,而是会尝试继续解析文本。
在一个简短的测试中,我可以找到一大堆有效的background-color
定义:\62ackground-color:
, \062ackground-color:
, \000062ackground-color:
, \62 ackground-color:
, bac\k\g\r\o\u\nd-c\o\l\or:
.
务实的解决方案:
编写自己的解析器。不要让它成熟或符合标准,保持简单并拥有属性白名单。您不想要的属性比您想要的属性要多得多。扔掉任何垃圾。
远离在 CSS 中运行 JavaScript 的浏览器。您必须在这里做一些研究,但是 IE 8 及更高版本不再支持 JS 表达式。其他问题依然存在。