处理嵌入式SVG脚本标记中的字符引用

时间:2015-06-20 10:05:32

标签: javascript html svg xss

这是一个xss脚本:

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

<script>代码之间的代码将被浏览器翻译为alert(1)并执行。

但如果我不使用<svg>代码,代码就不会被翻译成脚本。 谁能告诉我为什么会这样? <svg>标记如何工作​​?

2 个答案:

答案 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解析。