somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【php】htmlspecialchars

今更ながら、htmlspecialcharsについてのメモです。

htmlspecialchars

php開発者ならXSS対策に必ず使っている関数だと思います。変換対象は、以下の通りです。

変換対象となる文字は以下の通りです。

  • '&' (アンパサンド) は '&' になります。
  • ENT_NOQUOTES が設定されていない場合、'"' (ダブルクォート) は '"'になります。
  • ENT_QUOTES が設定されている場合のみ、"'" (シングルクオート) は ''' になります。
  • '<' (小なり) は '&lt;' になります。
  • '>' (大なり) は '&gt;' になります。

フレームワークから入ってしまうと、自動でエスケープしてくれるために出会わない・知らない人もいるようです。

第二引数

また、知っていても変換する文字列を引数にだけ渡している場合も多いです。この関数では第二引数が一番のポイントであると思っています。

ENT_COMPAT ダブルクオートは変換しますがシングルクオートは変換しません。

ENT_QUOTES シングルクオートとダブルクオートを共に変換します。

デフォルトでは、ENT_COMPATがで起用されるためシングルクオートが変換されず、htmlの属性をシングルクオートで囲んでいる場合などに対策漏れとなってしまいます。一方、ENT_QUOTESはクオートを両方とも変換するので問題ありません。

またphp5.4からは、定数 ENT_SUBSTITUTE、ENT_DISALLOWED、 ENT_HTML401、ENT_XML1、 ENT_XHTML および ENT_HTML5 が追加されているようです。5.4にはtraitなどの便利なものが含まれるのでいつかは使ってみたいため、これらの定数も把握する必要があると思います。

文字セット

第三引数で変換に使用される文字セットを指定します。5.3までは内部エンコーディングですが、5.4からはUTF8になったという話をよく耳にします。安易なバージョンアップにより、正しく動作しない可能性もあるようです。