2013年10月14日

PHPでエスケープ処理「htmlentities」を使う時の注意点

XSS(クロスサイトスクリプティング)やSQLインジェクションなど、PHPとMySQLで構築するプログラムには多くの危険性があります。これらの危険性を回避するための第一歩として「エスケープ処理」があります。

「エスケープ処理くらい基本中の基本なので、いつもやっていますよ」と思われるかも知れませんが、便利すぎるPHPの関数に頼っているおかげでセキュリティホールの原因となる事がありますので、その一例を書いていきます。

PHPでエスケープ処理を行う場合、代表的な関数として「htmlspecialchars」と「htmlentities」があります。「htmlspecialchars」が「<、>、&、"」の4文字をエンティティ参照に置き換えるのに対し、「htmlentities」はこれら4つの文字を含む100文字をエンティティ対象としています。そのため、「htmlentities」の方が、より厳密なエスケープ処理といえます。

echo htmlentities("エスケープ処理する文字列");

これだけでエスケープ処理が済んだように見えますが、「htmlentities」はデフォルト設定ではシングルクォートを変換しない、という落とし穴があります。そのため、シングルクォートも含めて変換させる場合、下記のような書き方となります。

echo htmlentities("エスケープ処理する文字列", ENT_QUOTES, mb_internal_encoding());

第二引数でシングルクォートも変換対象とするよう指定し、第三引数で文字コードを指定しています。第三引数に「mb_internal_encoding()」を指定しているのは、phpinfo()で確認できる「mb_internal_encoding」の値を返してくれるわけですが、うまくいかない場合は文字コードを直接指定することも出来ます。UTF-8の場合、下記のような記述となります。

echo htmlentities("エスケープ処理する文字列", ENT_QUOTES, "UTF-8");

セキュリティ対策の重要性が高まっている昨今、文字列の出力やDB格納時には、必ずシングルクォートを変換対象としたうえで「htmlentities」を使用するようにしましょう。

, ,

コメントを残す

メールアドレスが公開されることはありません。