TRY AND ERROR

気になったこと、勉強したこと、その他雑記など色々メモしていきます。。Sometimes these posts will be written in English.,

【PHP】HTML文字列のエスケープ

クライアント側に文字列を返すサーバ側の処理を考えた際に、
そのまま返すと文字列にscriptが含まれる場合にscriptが動作してしまうことも考えられます。

そこで、サーバから文字列を返す際には、HTMLを形成する特殊文字をエスケープする必要があります。
PHPにはhtmlspecialcharsというHTMLのエスケープメソッドが用意されています。

htmlspecialchars("文字列", "エスケープの種類", "文字コード");

エスケープの種類は以下の通りで、定数を指定します。

エスケープ種類(定数) 意味
ENT_COMPAT ダブルクォートは置き換えるが、シングルクォートは置き換えない
ENT_QUOTES シングルクォートとダブルクォートの両方を置き換える
ENT_NOQUOTES シングルクォートとダブルクォートの両方を置き換えない

入力フォームの値をサーバで取得し別ページに出力するようなプログラムがあったとして、
次のようなスクリプトが入力された場合、htmlspecialcharsを使っている場合とそうでない場合の出力結果は以下の通りです。

・htmlspecialcharsを使った場合
<script type="text\/javascript">alert(document.cookie)<\/script>

・htmlspecialcharsを使っていない場合
<script type=\"text\/javascript\">alert(document.cookie)<\/script>


htmlspecialcharsを使っていない場合、クライアント側で出力した段階でscriptが実行されてしまいます。悪意のあるスクリプトが入力されることを想定すると、出力時にHTMLとして認識させないことが重要です。

WEBサイト中で動的にHTMLやJavascriptを生成している部分に、悪意のあるコードを埋め込む攻撃のことをXSS(クロスサイトスクリプティング)という。