Posted at

htmlspecialcharsで文字参照まで無効化したときの対策

More than 3 years have passed since last update.

初投稿、ども…


問題発生の経緯


  • HTML, PHP, MySQL の文字コード設定がEUC-JPであったため(だと思うが)、絵文字や一部記号が数値文字参照("&#〜〜")でDBに登録されていた。

  • 動作テスト中に、DB内にXSSが仕込める事に気づく。


  • こちらを参考に、htmlspecialcharsechoにかませる事でXSSを回避した。

  • 数値文字参照用の&までエスケープされたために今度は絵文字が表示されなくなった


何を持って解決と呼ぶか

今回は営利目的でなく、実行速度の最適化も検討せず、またスパゲッティの生産に対して寛容な状況であったため、「XSSを回避しつつ、顔文字が表示される」という事のみをとりあえず満たせば達成ということにした。


対策

htmlspecialcharsでエスケープされる文字<>"&のうち、&以外がエスケープされていれば上記解決に至る、ということで、str_replaceで再置換をかけることにした。


下記実装。

function h($str) {

return str_replace('&amp;', '&', htmlspecialchars($str, ENT_QUOTES, 'EUCJP'));
}


おわり

まだまだ浅学非才の身ですので、皆様からの心温まるマサカリをお待ちしております。