通常、大括弧と引用符は、周囲の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`上
出典
2017-08-30 17:03:58
fgb
'...えーと、エッジは**私が何を意味onlderブラウザ –
@Jaromandaはそれが私はIE9 +エッジFirefoxのクロームオペラをテストしたすべてのブラウザでうまく動作しているされていません。私は好奇心として、JSONファイルを見ると、開発者ツールを入力して[ネットワーク]タブを検索すると、ブラウザは「エスケープされた」変数をうまく色付けできないということだけです。これは、エッジの上に完璧に動作するので、私は多分、着色エンジンが更新されないことを、仮説として言うと、それは同じように動作し、古いブラウザがちょうど推測、JSONファイルを読んでいました。 – Vixxs
ですから、あなたの質問はコードに関する問題ではなく、開発者用ツールコンソールはきれいですか? –