私を悩ませ続ける単純な質問。
ユーザー入力をすぐに HTML エンコードして、エンコードされたコンテンツをデータベースに保存する必要がありますか? または、生の値を保存して表示時に HTML エンコードする必要がありますか?
エンコードされたデータを保存すると、データが表示されているときに開発者がデータのエンコードを忘れるリスクが大幅に軽減されます。ただし、エンコードされたデータを保存すると、データマイニングがやや面倒になり、通常は問題になりませんが、少し多くのスペースが必要になります。
私を悩ませ続ける単純な質問。
ユーザー入力をすぐに HTML エンコードして、エンコードされたコンテンツをデータベースに保存する必要がありますか? または、生の値を保存して表示時に HTML エンコードする必要がありますか?
エンコードされたデータを保存すると、データが表示されているときに開発者がデータのエンコードを忘れるリスクが大幅に軽減されます。ただし、エンコードされたデータを保存すると、データマイニングがやや面倒になり、通常は問題になりませんが、少し多くのスペースが必要になります。
途中で情報をエンコードすることを強くお勧めします。生データをデータベースに保存すると、特定の時点での表示方法を変更したい場合に便利です。フローは次のようになります。
sanitize user input -> protect against sql injection -> db -> encode for display
代わりに RSS フィードとして情報を表示したい状況を考えてみてください。再表示する前に HTML 固有のエンコーディングをやり直さなければならないのは少しばかげているようです。入力がユーザーからのものであろうとデータベースからのものであろうと、開発は常に「入力を信頼しない」ミームに従う必要があります。
HTML エンコードされたテキストを理解しないもの (レポート ツールなど) を使用してデータベースにアクセスする必要がある場合があることに注意してください。スペースが問題ではないことに同意しますが、HTML エンコーディングをデータベースに配置すると、ビュー/フロント エンドの知識がアプリケーションの最下位層に移動します。これは設計ミスです。
エンコーディングは、ディスプレイでのみ行う必要があります。例外なく。
出力。
HTML では、文字列の長さを単純にチェックすることはできません ( &
1 文字ですがstrlen()
、5 と表示されます)。簡単に切り取ることができます (エンティティが壊れる可能性があります)。
データベースからの文字列を別のソースからの文字列と混合するか、それらを読み取って書き戻す必要がある場合があります。エスケープを逃さずにアプリケーション全体でこれを行い、二重エスケープを回避することは悪夢です。
PHP も同様のことを試みましmagic_quotes
たが、大失敗に終わりました。magic_entities
ルートを取らないでください!:)