いくつかのポイント:
- 異なるエンコーディングが異なるコンテキストのために必要とされます。すべてのデータをhtmlエンコーディングで焼くことは、特にXSSに対して役に立たないJavascriptコンテキストに何らかの形で書き込むと、必ずしも良いとは限りません。だからこのような観点から、私はJSONをデータとして扱い、JSONエンコーディングとhtmlだけを必要とします。もちろん、クライアント側のデータバインディングなどは、エンコーディングや安全なバインディングを処理する必要があります。
- JSONがAPI呼び出しで返された場合、応答のコンテンツタイプは非常に重要です。 などがある場合、jsonエンドポイント自体はXSSに対して脆弱です。
- たとえば、変数を初期化するためにJSONデータをスクリプトブロックに書き込むと、トリッキーになります。次のことを考えてみましょう:
<script>
var data = "{'key1': 'val1', 'key2': 'val2'}";
</script>
これは正常に見えるが、これを見てみましょう:
<script>
var data = "{'key1': 'val1', 'key2': '</script><script>alert(1)</script>'}";
</script>
それは単純な文字列のように見えますが、ブラウザは主にHTMLパーサです。それは<スクリプト>と< /スクリプト>の間のものを見つけ、それをJavascriptとして実行します。文字列内の最初の</script>
が最初の<script>
タグとペアになり、文字列の最初のオープンタグが完全に新しいスクリプトを開始し、XSSとなります。
JSONをJavaScriptの一部としてhtmlに書き込む予定がある場合(非常に一般的な用途)、残念なことにJSONコンテンツをHTMLにエンコードする必要があります。これを避け、データを別々にダウンロードする方がはるかに優れています。
これらの「近い」有権者から、ちょっとした推論を聞いてみると面白いでしょう。 –