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

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

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

どもです。

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

+--------------------------------+-----------------------------+
| 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)