PHP – htmlspecialcharsが効かないとき確認したこと

htmlspecialcharsが効かないとき確認したのがこちら。

対象となる文字

htmlspecialchars関数では下記の文字が変換対象になります。

もし下記の中になければ、htmlentities()や mb_encode_numericentity()で確認をしてみてください。

変更対象文字変換後
&
” ENT_NOQUOTES が指定されていない場合、"
‘ ' (ENT_HTML401 の場合) あるいは ' ( ENT_XML1ENT_XHTML、 ENT_HTML5 の場合)。ただし ENT_QUOTES が指定されている場合に限る
<&lt;
&gt;
対象となる文字

基本的なhtmlspecialcharsの例

$address = "<script>alert('Hi');</script>";
$address = htmlspecialchars($address, ENT_QUOTES, 'UTF-8');
var_dump($address);

//実行後の出力
string(51) "<script>alert('Hi');</script>"

上記のコードを実行するとstring(51) "<script>alert('Hi');</script>"と文字として表示されます。

一見効いていないと思うかもしれませんが、ページのソースコードを確認するとと&lt;script&gt;alert(&#039;Hi&#039;);&lt;/script&gt;と特殊文字がHTMLエンティティに置き換わっています。つまり、HTMLコードではなく、ただのテキストに置き換わっているのです。

もしhtmlspecialcharsを使用しないとどうなるのか。上記のhtmlspecialcharsの行をコメントし実行すると分かるかと思いますが、アラートが表示されます。これはブラウザ側がHTMLコードと認識してしまうためです。なのでそれを防ぐために、htmlspecialcharsを通しテキストとして扱う必要があります。