为什么<style>标签被认为是不安全的标记?

5
我最近使用了PageDown来清理从文本区域输入的HTML内容,发现它会删除“style”元素。我想知道为什么这些元素被认为是不安全的?

我也想知道这个问题。Gmail会过滤掉HTML邮件中的样式块,我认为这是出于安全原因,但我不知道具体原因。 - punkrockbuddyholly
样式元素不应该在HTML body中出现,只应该在head中。这可能是原因吗? - Mr Lister
3
IE 5、6和7支持“expression:”关键字,允许执行任意JavaScript代码。如果不加控制地使用该功能,就会导致存储型跨站脚本漏洞。http://www.dionyziz.com/Joy_XSS#A_word_on_expression.28.29 - Cheekysoft
1
@Cheekysoft 虽然 expression: 关键字很危险,但是阻止 <style> 标签并不能保护你免受此漏洞的影响。为了防范此类问题,你还需要阻止所有 HTML 元素中的 style 属性,或手动过滤内联 CSS 属性。或者像你的链接所提到的那样,阻止 所有 用户输入的 HTML。 - Dan Herbert
4个回答

4

IE有一个特殊的CSS功能,允许将JavaScript嵌入到CSS中。这就足以让人想禁止<style>标签了。

behavior:表达式也可以输入到style 属性中,因此您应该确保从白名单中删除style属性,或者列入白名单中的特定样式。您不应该尝试黑名单样式,因为有一些脚本可以通过样式进入,并且未来还有添加更多计划

另外,正如其他人所提到的,您可以完全使用CSS改变页面的外观。我想不出这会有什么危害,除非还允许其他标记(如<form>标签),但是如果有足够的创造力,我相信恶意人士可以想出一些点子。


0

样式表非常强大。它们可以有效地替换整个页面的内容(甚至可以使用图像,即使浏览器不完全支持内容插入)。不仅如此,一些较新的浏览器在与3D变换相关的漏洞方面表现不佳。(据我所知,您无法使用恶意制作的CSS触发这些漏洞,但如果出现这种情况,我也不会感到惊讶。)

在HTML4中,style明确属于head在HTML5中,它可以被限定范围以仅影响元素的子树,这可能会减少基于CSS的攻击的影响区域,但不会影响它在该区域内造成的损害。)


0

如果你要剥离任何HTML标签,通常最好的方法是白名单标签和属性(也就是有一个允许列表,然后剥离其他所有东西),而不是黑名单。HTML 可能有些复杂,并且仍在发展中;你怎么知道未来不会有一个<stuff>元素,让支持的浏览器运行任意内容呢?

话虽如此...与大多数元素不同,样式表可以改变嵌入其中的整个页面的外观。而且它不能可靠地限制,除非使用iframes等方式,或解析CSS并剥离有问题的属性和/或添加特定性。 (例如,HTML5规则不能依赖于IE8之类的浏览器--这仍然是目前使用最广泛的浏览器之一。实际上,作用域样式元素似乎还没有得到很好的支持。)特别是,理论上可能编写一些CSS,将整个页面转换为另一个页面。它甚至可以通过IE中的behavior运行本机代码。因此,对于将作为HTML输出的内容,我通常根本不允许这样做。对于管理后端,也许可以...但不适用于评论表单等。


0
我的考虑很简单,你应该防止用户提交 <script> 和其他可能操纵你的代码的标签,也许他们用于此目的的正则表达式还会删除 <style> 标签。但不要把这视为理所当然。
致谢:http://www.squarefree.com/securitytips/web-developers.html

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 <style> elements or style attributes.
HTML is that is not "well-formed" -- you can't be sure how quirky browsers will parse it. (Example: <b <i>Foo)

3
如果有人使用正则表达式解析任意的 HTML,他们应该被多次打击直到他们承诺停止。任何了解解析 HTML 的人都足够知道要避免自己动手。需要翻译的内容是:"their regular expression"。 - cHao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接