SPOILER ALERT:甘やかされたくない場合は続行しないでください
現在 Google XSSチャレンジレベル2 を行っています。
_element.innerHTML
_を使用してドキュメントに挿入されるXSSコードを挿入しています。 <script>alert("Foobar")</script>
が機能しない理由はわかりませんが、<img src="/" onerror = "alert(1);"
は機能します。
私はソースコードを見てみましたが、それでも理由がわかりません。私はXSSを初めて使用するので、回答を作成するときにソースコードを参照していただければ幸いです。
その答えは、ブラウザがページ内のさまざまな場所にあるスクリプトを実行する方法によって異なります。例えば:
<img src="/" onerror = "alert(1);"
や<body onload="alert(2)"></body>
などの入力が機能する理由)。例外:
defer
属性を持つスクリプトタグは、DOMが完全にレンダリングされるまで(ブラウザによっては)実行されません。たとえば、私はIEで同じチャレンジを試みましたが、次のユーザー入力を使用してポップアップに警告することができました:
<script defer>alert(2)</script>
InnerHTMLのスクリプトタグを介してDOMに挿入されたスクリプトは、挿入時に実行されません(インラインスクリプトは、元のページが解析されるときに実行されます)。一方、DOMに挿入された画像はそのときに読み込まれ、読み込みが失敗すると、onerrorイベントハンドラーが呼び出されます。