PHP – htmlspecialcharsが効かないとき確認したこと
htmlspecialchars
が効かないとき確認したのがこちら。
- 対象となる文字か
- htmlspecialcharsに変換されるべき文字列がセットされているのか(使い方が間違っている)
- スペルミスや間違った変数をデバックしていた
対象となる文字
htmlspecialchars関数では下記の文字が変換対象になります。
もし下記の中になければ、htmlentities()や mb_encode_numericentity()で確認をしてみてください。
変更対象文字 | 変換後 |
---|---|
& | & |
” | ENT_NOQUOTES が指定されていない場合、" |
‘ | ' (ENT_HTML401 の場合) あるいは ' ( ENT_XML1 、ENT_XHTML 、 ENT_HTML5 の場合)。ただし ENT_QUOTES が指定されている場合に限る |
< | < |
> | > |
基本的な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>"
と文字として表示されます。
一見効いていないと思うかもしれませんが、ページのソースコードを確認するとと<script>alert('Hi');</script>
と特殊文字がHTMLエンティティに置き換わっています。つまり、HTMLコードではなく、ただのテキストに置き換わっているのです。
もしhtmlspecialchars
を使用しないとどうなるのか。上記のhtmlspecialchars
の行をコメントし実行すると分かるかと思いますが、アラートが表示されます。これはブラウザ側がHTMLコードと認識してしまうためです。なのでそれを防ぐために、htmlspecialchars
を通しテキストとして扱う必要があります。