这是一个xss脚本:
<svg><script>alert(1)</script></svg>
<script>
代码之间的代码将被浏览器翻译为alert(1)
并执行。
但如果我不使用<svg>
代码,代码就不会被翻译成脚本。
谁能告诉我为什么会这样? <svg>
标记如何工作?
答案 0 :(得分:4)
根据HTML 5规范,HTML解析器明确禁止在脚本标记中使用character references。
HTML5将separate script parsing mode作为众多令牌化模式中的一种,这些模式因上下文而异。脚本解析不允许字符引用,其他一些解析模式也可以。
SVG基于XML,其中规则更简单,更直接。基本上允许在任何地方使用字符引用,因为aren't different context sensitive parsing modes。
对于html中的SVG,HTML规范says
SVG名称空间中的svg元素属于嵌入式内容,短语内容和流内容类别,用于本规范中的内容模型。
换句话说,将所有SVG文本解析为短语内容。所有SVG都是HTML 5解析器的单一自定义标记化模式。
答案 1 :(得分:0)
由于我对其他答案引用这种行为背后的原因并不感到满意,因此我将这一问题升级为“问题”。到了WHATWG mailing list,因为它确实存在一些可能的(尽管很小的)安全漏洞。引用Ian Hickson(W3C HTML5标准的主编)verbatim:
它并不好,但它是故意的。在
<svg>
和<math>
块内, 我们使用&#34;外国内容&#34;解析模式,其中解析很多 与传统的HTML解析相比,遗留的XML解析更类似于:https://html.spec.whatwg.org/#parsing-main-inforeign
请特别注意此处
<script>
的特殊行为 并不包括改变令牌器模式,就像它一样 非外国内容。
因此,虽然Robert的回答基本上是与独立HTML5和SVG内容有关的正确引用的集合,但有一个特定的单独部分关于解析的外国内容&# 39;解释这种行为。 Ian同意它并不是一个完美的解决方案,但老实说,我无法想到一个兼容&#34;半SGML&#34;和XML解析。