IE有一个特殊的CSS功能,允许将JavaScript嵌入到CSS中。这就足以让人想禁止<style>
标签了。
behavior:
表达式也可以输入到style
属性中,因此您应该确保从白名单中删除style
属性,或者列入白名单中的特定样式。您不应该尝试黑名单样式,因为有一些脚本可以通过样式进入,并且未来还有添加更多计划。
另外,正如其他人所提到的,您可以完全使用CSS改变页面的外观。我想不出这会有什么危害,除非还允许其他标记(如<form>
标签),但是如果有足够的创造力,我相信恶意人士可以想出一些点子。
样式表非常强大。它们可以有效地替换整个页面的内容(甚至可以使用图像,即使浏览器不完全支持内容插入)。不仅如此,一些较新的浏览器在与3D变换相关的漏洞方面表现不佳。(据我所知,您无法使用恶意制作的CSS触发这些漏洞,但如果出现这种情况,我也不会感到惊讶。)
(在HTML4中,style
明确属于head
。 在HTML5中,它可以被限定范围以仅影响元素的子树,这可能会减少基于CSS的攻击的影响区域,但不会影响它在该区域内造成的损害。)
如果你要剥离任何HTML标签,通常最好的方法是白名单标签和属性(也就是有一个允许列表,然后剥离其他所有东西),而不是黑名单。HTML 可能有些复杂,并且仍在发展中;你怎么知道未来不会有一个<stuff>
元素,让支持的浏览器运行任意内容呢?
话虽如此...与大多数元素不同,样式表可以改变嵌入其中的整个页面的外观。而且它不能可靠地限制,除非使用iframes等方式,或解析CSS并剥离有问题的属性和/或添加特定性。 (例如,HTML5规则不能依赖于IE8之类的浏览器--这仍然是目前使用最广泛的浏览器之一。实际上,作用域样式元素似乎还没有得到很好的支持。)特别是,理论上可能编写一些CSS,将整个页面转换为另一个页面。它甚至可以通过IE中的behavior
运行本机代码。因此,对于将作为HTML输出的内容,我通常根本不允许这样做。对于管理后端,也许可以...但不适用于评论表单等。
<script>
和其他可能操纵你的代码的标签,也许他们用于此目的的正则表达式还会删除 <style>
标签。但不要把这视为理所当然。Things you should ensure are never allowed in user-submitted HTML, to protect the accounts of visitors who use Firefox and IE:
javascript:, vbscript:, and data: URLs in links, images, anywhere. <script> tags, with or without src attributes. Event attributes (on*), which contain scripts. -moz-binding: or behavior: CSS properties inside elements or style attributes. HTML is that is not "well-formed" -- you can't be sure how quirky browsers will parse it. (Example: Foo)
expression:
关键字很危险,但是阻止<style>
标签并不能保护你免受此漏洞的影响。为了防范此类问题,你还需要阻止所有 HTML 元素中的style
属性,或手动过滤内联 CSS 属性。或者像你的链接所提到的那样,阻止 所有 用户输入的 HTML。 - Dan Herbert