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