[PHP] 特殊文字をエスケープするhtmlspecialcharsの使い方

2019-04-12PHPセキュリティ

htmlspecialchars() は、 HTML タグなどに使われる特殊文字をエスケープし、 XSS や悪意のあるスクリプトによる攻撃を防ぐための PHP の関数

エスケープする意味

HTML の特殊文字をエスケープする意味目的は、主に XSS(クロスサイトスクリプティング)攻撃を防ぐこと

例えば、ユーザーによる入力項目があって、入力された文字列を画面に出す(例えば確認画面とか)場合、エスケープをしないと、HTML タグやスクリプトが実行される

入力例 1

echo '<p style="color:red;font-size:30px">pタグ</p>';

表示

pタグ

入力例 2

echo '<script>alert("スクリプト");</script>';

表示

scripts run when no escaping
javascriptのalert()が実行される

* エスケープ処理だけで攻撃が 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_HTML401HTML 4.01 として処理
ENT_HTML5HTML 5 として処理

その他は、公式ドキュメント 参照

ENT_HTML401 と ENT_HTML5 の違いは、シングルクォートのエスケープの仕方が異なるという点
ENT_HTML401 のエスケープ : & #039; (シングルクォート)
ENT_HTML5 のエスケープ : & apos; (シングルクォート)

エスケープされる文字の種類

特殊文字エスケープ後
& (アンパサンド)&amp;
" (ダブルクォート)&quot;
' (シングルクォート)&#039;( ENT_HTML401 )または、&apos;( ENT_XML1、ENT_XHTML 、 ENT_HTML5 )
< (小なり)&lt;
> (大なり)&gt;

使うタイミング

HTML を出力(表示)するとき

関数化

function h($str) {
  return htmlspecialchars($str, ENT_QUOTES|ENT_HTML5, "UTF-8");
}
// HTMLに出力する際
echo h('<hoge>');

Posted by Agopeanuts