为什么这个向量:
<svg><script>alert(/1/.source)</script>
在http://jsfiddle.net/ZgPY4/2/和这个
<script>alert(/1/.source)</script>
没有。如何<svg>
让它发挥作用?
为什么这个向量:
<svg><script>alert(/1/.source)</script>
在http://jsfiddle.net/ZgPY4/2/和这个
<script>alert(/1/.source)</script>
没有。如何<svg>
让它发挥作用?
HTML<script>
具有其他元素没有的特殊功能:它是“CDATA 元素”。这意味着直到元素末尾的任何<
或&
字符都被视为字面意思这些字符。所以传递给 JS 解释器的是:
alert(/1/.source)
这显然不是有效的 JS 语法。
“CDATA 元素”的概念来自开发 HTML 的 SGML 世界。但是 SVG 来自 XML 世界,在这个世界中,事情被简化并且没有 CDATA 元素。因此,SVG<script>
元素没有特殊的权力:在 SVG 脚本中,<
引入标签并&
引入实体或字符引用。
因此,(
被解析(
并传递给 JS 解释器的结果字符串是:
alert(/1/.source)
在 XML 术语中,<script>
元素位于 HTML 名称空间中,而<svg><script>
元素位于 SVG 名称空间中,因此它们是不同的元素。HTML5 通过隐藏命名空间前缀并将非 XML 解析器应用于 SVG 使这一切变得不那么清晰(这就是为什么(
尽管它的格式不正确;应该是这样(
)。
( #
hash,sharp,pound) 会破坏您的 Javascript。在<svg>
标记对(未提供结束标记)内部,实体编号被转换为正确的字符引用,因为它呈现为 html,然后引擎执行ECMA 脚本(允许为绘图执行该脚本)。
OWASP.org 将其记录为不带分号的十六进制编码。