2015-06-20 64 views
9

这是一个XSS脚本:处理字符引用的标签

<svg><script>&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</script></svg> 

<script>标记之间的代码将被浏览器转换为alert(1)和执行。

但是,如果我不使用<svg>标记代码将不会被翻译为脚本。 谁能告诉我为什么会发生这种情况? <svg>标签如何工作?

+1

为什么downvotes?似乎是一个很好的问题。 –

+0

在Chrome中证实了这一点,看起来像是DOM解析的一个奇怪的副作用。非常怀疑某种“标准”在这里涉及。 –

+0

@NielsKeurentjes这里的一切都是由XML和html 5标准明确定义的。 –

回答

4

根据HTML 5规范,HTML解析器明确禁止在脚本标记中使用character references

HTML5有一个separate script parsing mode作为随上下文而变化的许多标记化模式之一。脚本解析不允许使用字符引用,其他一些解析模式也可以。

SVG基于XML,规则更简单,更直接。基本上,字符引用在任何地方都是允许的,因为那里有aren't different context sensitive parsing modes

对于SVG在HTML中,HTML规范says

从SVG命名空间中的SVG元素落入嵌入的内容,措辞内容和流内容类别的内容模型本说明书中的用途。

换句话说,将所有SVG文本解析为短语内容。所有SVG都是HTML 5解析器的单一自定义标记化模式。

+0

请检查我的新答案:)如上所述,您的答案完全正确,只是不完整的解释这个具体案例。 –

0

由于我对其他答案引用此行为背后的推理并不满意,我将这个问题升级到WHATWG mailing list,因为它确实存在一些可能的(尽管很小的)安全漏洞。引用Ian Hickson(W3C HTML5标准的主编)verbatim

这不是很好,但它是故意的。在<svg><math>块, 我们使用“外来内容”解析模式,其中分析是非常 比传统HTML解析更类似于传统的XML解析:

https://html.spec.whatwg.org/#parsing-main-inforeign

请特别注意,为<script>的特殊行为这里 不包括更改记号器模式,就像 中的非外来内容一样。

所以,当罗伯特的回答基本上是属于到独立HTML5和SVG内容正确引号的集合,有关于解析的“洋内容”解释这种行为特定的单独部分。 Ian同意这不是一个完美的解决方案,但说实话,我想不出一个兼容“半SGML”和XML解析的解决方案。