2017-08-30 8 views
0

私のウェブサイトでは、ユーザーの入力からのhtmlタグはhtmlspecialcharsでエスケープされ、htmlタグ+エスケープされたユーザーコンテンツをPHP json_encodeを使用してJSON変数として送信します。これはすべて「as」としてエスケープされます。ユーザー入力がすでにエスケープされているため、htmlです。JSONでHTMLをHEXにエンコードする必要がありますか?

これはうまく動作しますが、問題はありませんでした。どのようにXSS攻撃が可能かはわかりませんでした。

しかし、私はTwitterとfacebookがすべてのhtmlタグをHEXにエンコードしていることを知っているので、同じようにすればJSON_HEX_TAG JSON_HEX_AMP JSON_HEX_APOS JSON_HEX_QUOTjson_encode()に追加します。

なぜTwitterやFacebookでこれをやっているのですか?セキュリティエラーを作成できませんでした。

+0

'...えーと、エッジは**私が何を意味onlderブラウザ –

+0

@Jaromandaはそれが私はIE9 +エッジFirefoxのクロームオペラをテストしたすべてのブラウザでうまく動作しているされていません。私は好奇心として、JSONファイルを見ると、開発者ツールを入力して[ネットワーク]タブを検索すると、ブラウザは「エスケープされた」変数をうまく色付けできないということだけです。これは、エッジの上に完璧に動作するので、私は多分、着色エンジンが更新されないことを、仮説として言うと、それは同じように動作し、古いブラウザがちょうど推測、JSONファイルを読んでいました。 – Vixxs

+0

ですから、あなたの質問はコードに関する問題ではなく、開発者用ツールコンソールはきれいですか? –

答えて

0

あなたの戦略は、XSSの観点からはうまくいくと思います。 16進数のエンコーディングはおそらく他の言語/文字セットをサポートするでしょうか?

+0

これは(マルチバイトのUnicode)、PHP 5.4.0からデフォルトで行われるので、やっています。彼らはHTMLタグをエンコードしていますので、< >& "'を16進数として、デフォルトの' json_encode'はHTMLタグをエンコードしません – Vixxs

0

通常、大括弧と引用符は、周囲のHTMLコンテキストから逃げることができるため、エスケープする必要があります。 json_encodeはそれ自体でHTMLを使わずに '.js'ファイルに出力する場合にのみ役に立ちます。

どちらの方法でもXSSを防ぐことができますが、違いは出力が異なることです。 htmlspecialcharsは、 '<'を '& lt;'に変換します。 (htmlエンティティ)、16進エンコーディングは '<'を '\ u003C'(JavaScript文字列リテラルエスケープシーケンス)に変換します。 JavaScript変数にデータを送信する場合は、JavaScriptでデータの整合性を確保する必要があります。

JavaScriptに「1か月間」というメッセージを送信したいとします。進エンコーディングで

は、次のように記述:

<script> 
    var input = <?php 
     $input = "One month's time"; 

     $input = json_encode($input, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); 

     echo $input; 
    ?>; 
    console.log(input); 
</script> 

、それが出力する「1ヶ月の時間」意志、あなたが望むよう。データが破損している、;

<script> 
    var input = <?php 
     $input = "One month's time"; 

     $input = htmlspecialchars($input, ENT_QUOTES, "utf-8"); 
     $input = json_encode($input); 

     echo $input; 
    ?>; 
    console.log(input); 
</script> 

、それが出力する "sの時間ワン月&#039":htmlspecialchars

、あなたが書きます。これはHTMLエンコードされているが、HTMLコンテキストに直接挿入されていないためです。

あなたがinnerHTMLプロパティを設定、または類似している場合は、DOMベースのXSSを防ぐためにかかわらず、あなたは、HTMLエンコードを使用する必要がありますが、これはJavaScriptのではなく、PHPで行うことができます。古いbrowser`上

関連する問題