ど素人から毛を生やす。<延>

htmlspecialcharsを使用するときは「重ねがけ」に要注意

Web > PHP 2017年12月5日(最終更新:6年前)

2017年12月5日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。

とある一覧を表示するとき、


+--------------------------------+-----------------------------+
| htmlspecialchars("category1")  | htmlspecialchars("value1")  |
+--------------------------------+-----------------------------+
| htmlspecialchars("category2")  | htmlspecialchars("value2")  |
+--------------------------------+-----------------------------+
| htmlspecialchars("category3")  | htmlspecialchars("value3")  |
+--------------------------------+-----------------------------+

まぁ内容は何でも良いですが、とにかくtext型の値を全て「htmlspecialchars()」で出力したとします。

このとき、「シューズ&バッグ」というカテゴリがあったとして、
とあるページで表示が「シューズ&バッグ」になってしまうという不具合が報告されました。

つまり、エンティティ化された「&」が、何故かエンティティの状態で表示されていると。

この原因、限りなく簡略化すると、こんなもん。


$array = array("シューズ&バッグ");
$array = array_map('htmlspecialchars', $array);

echo htmlspecialchars($array[0]); //シューズ&バッグ

つまり、1つの文字データに対し、htmlspecialchars()が2重にかかってしまった状態。
こうなってしまうと、


シューズ&バッグ			(元)
↓
シューズ&バッグ		(1回目)
↓
シューズ&バッグ	(2回目)

はい。
そりゃ表示が「シューズ&バッグ」になりますな。

何かとhtmlspecialchars()使いたがる方っていますが、それ自体が正しいのはわかりますが、
既存のコードを見て「echoするときはhtmlspecialchars()した方が良いんだ~」みたいな感じになると、ちょっと危険。

やっぱり共通関数に「echo_h」みたいに作っておいて、
function echo_h($str){echo htmlspecialchars($str);}ってやるのが良いのかな。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)