1

たとえば、次の HTML を見てください。

<td onclick="$(this).html('Wanted HTML: <br>; Unwanted HTML: &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;')">
Click to Show</td>

ご覧のとおり、不要な HTML は既に (PHP を使用して) エンティティにエスケープしています。しかし、ボックスをクリックすると、JavaScript が実行されます。

に変更.htmlすると.text、改行も文字通り表示されます。

<br>ボックスをクリックすると、sが改行として表示されますが、s&lt;&gt;s は文字通り小なり大なり記号として表示されますか?

4

1 に答える 1

2

問題は、文字がonclickJavaScript 関数に到達する前に でデコードされていることです。

二重にエンコードする必要があります。したがって、あなたの例は次のようになります。

<td onclick="$(this).html('Wanted HTML: &lt;br&gt;; Unwanted HTML: &amp;lt;script&amp;gt;alert(&amp;#39;xss&amp;#39;)&amp;lt;/script&amp;gt;')">
    Click to Show
</td>

必要なタグをエンコード (単一エンコード) したことに注意してください。また、最初に欠けていたセミコロンを追加しました&gt;

もちろん、より良い解決策は、これを HTML から完全に削除することです。ほとんどの開発者は、JavaScript はインタラクティブ性用であり、HTML はコンテンツ用であり、可能な限り混合を少なくする必要があることに同意します (JavaScript は などの呼び出しでコンテンツにフックされますaddEventHandler) 。

于 2013-03-30T02:50:22.330 に答える