なぜこのベクトルは:
<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は、物事が単純化され、CDATA要素がないXMLの世界から来ています。したがって、SVG <script>
要素には特別な機能はありません。SVGスクリプト内では、<
はタグを導入し、&
はエンティティまたは文字参照を導入します。
その結果、(
は(
に解析され、JSインタープリターに渡される結果の文字列は次のようになります。
alert(/1/.source)
XML用語では、<script>
要素はHTML名前空間にあり、<svg><script>
要素はSVG名前空間にあるため、これらは異なる要素です。 HTML5では、名前空間プレフィックスを非表示にし、非XMLパーサーをSVGに適用することで、これをあまり明確にしません(そのため、整形式ではないにもかかわらず(
は機能します。(
である必要があります)。
#
(ハッシュ、シャープ、ポンド)はJavascriptを壊します。 <svg>
タグペアの内部(終了タグは提供されません)エンティティ番号は、htmlとしてレンダリングされるため、適切な文字参照に変換され、エンジンは ECMAスクリプト(これは描画のために行うことができます) 。
OWASP.orgはこれを セミコロンなしの16進エンコーディング として文書化しています。