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」を使用するようにしましょう。