私はOWASP XSS 防止チート シートを読んでいて、次のコードがアンチパターンと見なされていることに気付きました。
<script>
var initData = <%= data.to_json %>; // Do NOT do this without encoding the data with one of the techniques listed below.
</script>
それが提案した代替案はこれでした:
<script id="init_data" type="application/json">
<%= html_escape(data.to_json) %>
</script>
...次に、JavaScriptファイルで:
var dataElement = document.getElementById('init_data');
var jsonText = dataElement.textContent || dataElement.innerText // unescapes the content of the span
var initData = JSON.parse(jsonText);
ただし、チート シートでは、元のコードの何が問題なのかについては触れていません。それは単なるアンチパターンですか、それとも XSS の実際の機会はありますか? PHPjson_encode()
は、それを有効な JSON オブジェクトに変換するために必要なすべてのエスケープを正しく行う必要があるようです。JSON は、U+2028 および U をエスケープする限り機能する Javascript の十分に近いサブセットです+2029.