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

PHPセキュリティ

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