2017-11-27 11 views
0

json_encode()を使用してJSONデータを返すPHP APIを呼び出す純粋なjavascriptプラットフォームでXSSを回避する方法を探しています。PHP JSON APIを使用してJavaScriptプラットフォームでXSSを実行する方法を教えてください。

この基本的な例ましょう:あなたのよう

<?php 
echo json_encode(array('name'=>"<script>alert('hello world');</script>"), JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); 
?> 

:のは、上記のjson_encode()を使用してPHPでつかんで、ブラウザに返されるデータベースフィールドに保存されているとしましょう

<script>alert('hello world');</script> 

を私はjavascriptの使用のためにデータを浄化することを期待して、いくつかのjsonオプションを使用しました。しかし、私はJavaScriptで次の手順を実行する場合、アラートがまだ実行されます。

<script> 
$('.nameField').html(jsonData.name); 
</script> 

私は何を読んでからは、JSONのオプションはjson_encodedデータのためのベストプラクティスですが、まだそれはまだ実行されます。

どこが間違っていますか?

答えて

3

あなたは間違ったレイヤーを見ています。ここの脅威はJSONではなく、JSON内部のHTMLです。 (JSON層に脅威があるかもしれませんが、あなたの質問には十分な情報がありません)。

あなたが提供しているオプションは、 JSONを配列リテラルとして解析させるために<script>要素に変換します。

...それはあなたがやっていることではありません。

あなたはjsonDataと呼ばれる変数に解析されたJSONを入れて、不特定何かを行っています。

この時点で、JSON固有のXSS保護は無関係です。それは重要な点を過ぎている。

JSONからHTMLを取り出し、jQueryで処理してDOMに注入します。

これを防御する方法は、ではありません。は、HTMLとして扱うべきだとjQueryに伝えます。

方法.html()の代わりに.text()メソッドを使用してください。

-1

htmlentities($javascript, ENT_QUOTES | ENT_HTML5, 'UTF-8');でカバーしてください。

ページに正確なHTMLを表示する必要がある場合は、htmlpurifierのようなPHPライブラリを使用してください。

ただし、後述のように.html()の代わりに.text()を挿入することもできますが、可能であればエスケープする方がよいでしょう。

関連する問題