htmlspecialchars() は、HTMLタグなどに使われる特殊文字をエスケープし、XSSや悪意のあるスクリプトによる攻撃を防ぐためのPHPの関数です。
XSS(クロスサイトスクリプティング)とは
クロスサイトスクリプティングとは、Webサイトの中にHTMLやJavaScriptを埋め込むことでサイト管理者が意図しない動作を引き起こす攻撃手法のことです。
この攻撃を受けると、Cookieを盗み取られたりセッションハイジャックを行われたり、Webサイトを改ざんされてしまう可能性があります。
XSSの攻撃例
実際にXSSの攻撃例を考えてみましょう。
例えばユーザが入力した任意のユーザーネームを、プロフィールに表示するWebページがあるとします。
ユーザーネーム設定フォーム
<form action="/setting" method="post">
<input type="text" name="username">
<input type="submit" value="登録する">
</form>
プロフィール
<h2><?php echo $username; ?>さんのプロフィールです</h2>
このプロフィールページでは、ユーザーが入力したテキストがそのまま出力されます。
開発者は、ここにユーザーネームを表す文字列を入力してもらうものとしてフォームを設置しています。
しかしここには、悪意をもったユーザーが開発者の意図に反した文字列を入力することができてしまいます。
<script>location.reload();</script>
例えばこのようなjavascriptのコードが入力されると、延々とページの再読み込みが続きます。
同様の方法で、アラートを表示したり違うページに飛ばしたり、訪問者のcookieを取得することもできます。
PHPで行うXSS対策
ここで登場するのがPHPの関数のひとつ、htmlspecialcharsです。
HTMLでは、< や > 等の特殊文字はHTMLのタグを示す記号として働いています。そこでHTMLタグやスクリプトが実行されないよう、htmlspecialchars関数を使ってこれらの特殊文字をHTMLエンティティに変換するエスケープを行います。
・アンド (&)→ 『&』
・小なり (<)→ 『<』
・大なり (>)→ 『>』
・シングルクォーテーション (')→ 『'』または『'』但しENT_QUOTESが指定されている場合
・ダブルクォーテーション (")→ 『"』但しENT_NOQUOTESが指定されていない場合
htmlspecialchars(エスケープする文字列, エスケープの方法, 文字コード);
・第二引数はエスケープの方法を指定
デフォルトは「 ENT_COMPAT | ENT_HTML401 」です。基本的に「 ENT_QUOTES 」を指定します。
・第三引数はエンコードする文字コードを指定
省略した場合には、PHP のバージョンによってデフォルト値が変わります。
PHP 5.6.0 以降であれば default_charset が使用され、default_charsetのデフォルトは UTF-8 です。
使用例(先ほどのプロフィールにエスケープ処理を行う)
<h2><?php echo htmlspecialchars($username, ENT_QUOTES); ?>さんのプロフィールです</h2>