这是一个XSS脚本:处理字符引用的标签
<svg><script>alert(1)</script></svg>
<script>
标记之间的代码将被浏览器转换为alert(1)
和执行。
但是,如果我不使用<svg>
标记代码将不会被翻译为脚本。 谁能告诉我为什么会发生这种情况? <svg>
标签如何工作?
这是一个XSS脚本:处理字符引用的标签
<svg><script>alert(1)</script></svg>
<script>
标记之间的代码将被浏览器转换为alert(1)
和执行。
但是,如果我不使用<svg>
标记代码将不会被翻译为脚本。 谁能告诉我为什么会发生这种情况? <svg>
标签如何工作?
根据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解析器的单一自定义标记化模式。
请检查我的新答案:)如上所述,您的答案完全正确,只是不完整的解释这个具体案例。 –
由于我对其他答案引用此行为背后的推理并不满意,我将这个问题升级到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解析的解决方案。
为什么downvotes?似乎是一个很好的问题。 –
在Chrome中证实了这一点,看起来像是DOM解析的一个奇怪的副作用。非常怀疑某种“标准”在这里涉及。 –
@NielsKeurentjes这里的一切都是由XML和html 5标准明确定义的。 –