[PHP] 特殊文字をエスケープするhtmlspecialcharsの使い方
htmlspecialchars()
は、 HTML タグなどに使われる特殊文字をエスケープし、 XSS や悪意のあるスクリプトによる攻撃を防ぐための PHP の関数
Contents
エスケープする意味
HTML の特殊文字をエスケープする意味目的は、主に XSS(クロスサイトスクリプティング)攻撃を防ぐこと
例えば、ユーザーによる入力項目があって、入力された文字列を画面に出す(例えば確認画面とか)場合、エスケープをしないと、HTML タグやスクリプトが実行される
入力例 1
echo '<p style="color:red;font-size:30px">pタグ</p>';
表示
pタグ
入力例 2
echo '<script>alert("スクリプト");</script>';
表示
* エスケープ処理だけで攻撃が 100 % 防げるわけではない。その他の対策も必要だが、最低限やるべきことの 1 つ
htmlspecialchars()
の使い方
書き方
htmlspecialchars([エスケープする文字列], ENT_QUOTES|ENT_HTML5, "UTF-8");
第二引数はエスケープの方法を指定
デフォルトは「 ENT_COMPAT | ENT_HTML401 」、基本的に「 ENT_QUOTES 」を指定する
第三引数は、エンコードする文字コードを指定
省略した場合には、 PHP のバージョンによってデフォルト値が変わる
PHP 5.6.0 以降であれば default_charset が使用され、 default_charset のデフォルトは UTF-8
PHP 5.4 以前の default_charset のデフォルト値は ISO-8859-1
第二引数の種類
ENT_COMPAT | ダブルクオートはエスケープするが、シングルクオートはしない |
ENT_QUOTES | ダブルクオートもシングルクオートも両方エスケープする |
ENT_NOQUOTES | ダブルクオートもシングルクオートもエスケープしない |
ENT_HTML401 | HTML 4.01 として処理 |
ENT_HTML5 | HTML 5 として処理 |
その他は、公式ドキュメント 参照
ENT_HTML401 と ENT_HTML5 の違いは、シングルクォートのエスケープの仕方が異なるという点
ENT_HTML401
のエスケープ : & #039; (シングルクォート)ENT_HTML5
のエスケープ : & apos; (シングルクォート)エスケープされる文字の種類
特殊文字 | エスケープ後 |
---|---|
& (アンパサンド) | & |
" (ダブルクォート) | " |
' (シングルクォート) | '( ENT_HTML401 )または、'( ENT_XML1、ENT_XHTML 、 ENT_HTML5 ) |
< (小なり) | < |
> (大なり) | > |
使うタイミング
HTML を出力(表示)するとき
関数化
function h($str) {
return htmlspecialchars($str, ENT_QUOTES|ENT_HTML5, "UTF-8");
}
// HTMLに出力する際
echo h('<hoge>');