- 締切済み
文字の無害化のタイミング
PHPにて、ユーザの入力情報を保管し、サイト内で表示利用するシステムの入力に対する文字列の無害化に関しまして、 今まではユーザの入力→htmlspecialchars→データベース取込 という流れで行っておりました。 最近、他のことを調べていると、 ユーザの入力→データベース取込→表示の際にhtmlspecialcharsする という記事を見かけました。 どちらの方がより、無害化の効果がありますでしょうか。 後キュよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- agunuz
- ベストアンサー率65% (288/438)
「必要なときに必要な処理」を行うのが基本です。データベースに格納するときは「データベースに格納するためのエスケープ処理」だけを行います。 htmlspecialcharsを重複して実行してしまっても困りますし(htmlspecialcharsしているハズと思って)処理漏れがあってもダメですから「htmlとして表示するときに」無害化するのが確実で間違いありません。 同じ内容をなメールの本文(text/plain)に展開するときは、htmlspecialcharsせずに記載しますからね。
> ユーザの入力→htmlspecialchars→データベース取込 > ユーザの入力→データベース取込→表示の際にhtmlspecialcharsする この両者であれば、後者の「表示の際にhtmlspecialcharsする」が正しいと思います。 そもそも、「無害化」という発想そのものが奇妙であると思います。「HTMLは、タグとして記述される場合以外は<>&などといった特殊記号はエスケープして書くように設計されている」というだけのことですので、どんな場合でもHTML記述時に記号をエスケープするのが基本でしょう。それはデータベースの保存うんぬんは関係なく、手書きでHTMLのコードを書くような場合から常に一貫して考えるべきものなのですから。 また、「データは可能な限りオリジナルの状態を保持する」のがデータ処理の基本であると思います。加工したデータは、もう元には戻せません。こうした点からいっても、「加工済みのデータを保管する」というのは違和感を覚えます。 更には、「データベース保管時に考えるべきは、サニタイズではなく、SQLインジェクション対策である」という点も忘れてはいけません。必要なときに必要な対策をまず考えるべきで、データベース保管時にSQLインジェクション対策の他に(別に後でやってもかまわない)サニタイズまでまとめて処理する、というのはどうなのだろう、という気がします。自分はわかっても、例えば他人に引き継いだりしたとき混乱したり勘違いしたりしないか、という不安があります。 いろいろ考えると、データベースへの保管時は、SQLインジェクション対策のみをしっかりと考え、HTMLを出力するときには、(それがデータベースから取り出したものかどうかは関係なく、すべてのところで常に)htmlspecialchars処理したコードを書く、と考えるのがいいのではないかと思います。