たとえば、データベースに格納する前にHTMLをエンコードする必要がありますか? それとも、ブラウザに送信する途中でエンコードするのが通常の方法ですか?
追加のストレージを確保するために、データベース内のすべてのテキストベースのフィールドの長さを 4 倍にする必要がありますか?
確実な「はい」または「いいえ」ではなく、ベストプラクティスを探しています:-)
たとえば、データベースに格納する前にHTMLをエンコードする必要がありますか? それとも、ブラウザに送信する途中でエンコードするのが通常の方法ですか?
追加のストレージを確保するために、データベース内のすべてのテキストベースのフィールドの長さを 4 倍にする必要がありますか?
確実な「はい」または「いいえ」ではなく、ベストプラクティスを探しています:-)
データベース内のデータは本当に HTML ですか?それとも、たまたま HTML ページの一部になることがわかっている、名前やコメントなどのアプリケーション データですか?
アプリケーションデータの場合は、次のことが最善だと思います。
MVC のファンなら、これはビュー/コントローラーをモデル (および永続的なストレージ形式) から分離するのにも役立ちます。
表現
たとえば、誰かが「I love M&Ms」というコメントを残したとします。"I love M&Ms"
HTML エンコードされたString ではなく、プレーンテキストの String としてコード内で表現するのがおそらく最も簡単"I love M&Ms"
です。技術的には、コード内に存在するデータはまだ HTML ではありません。データが可能な限り単純に正確に表現されていれば、作業は楽になります。このデータは、後で別のビュー (デスクトップ アプリなど) で使用される場合があります。このデータは、データベース、フラット ファイル、または XML ファイルに保存され、後で別のプログラムと共有される可能性があります。他のプログラムにとって、文字列がフォーマットの「ネイティブ」表現 ("I love M&Ms"
データベース、フラット ファイル、および"I love M&Ms"
XML ファイル) にあると想定するのが最も簡単です。HTML でエンコードされた値が XML ファイル ( "I love &Ms"
) にエンコードされているのを見るとうんざりします。
翻訳
後で、データが表現の境界を越えようとしている場合(HTML で表示される、データベースに保存される、プレーンテキスト ファイル、または XML ファイルなど)、適切に翻訳されていることを確認して、正確に表現されるようにすることが重要です。その次の環境にネイティブなフォーマット。つまり、HTML ページに表示するときは、適切にエンコードされた HTML に (手動またはツールを使用して) 変換されていることを確認して、値がページに正確に表示されるようにします。データベースに保存したり、クエリで使用したりする場合は、エスケープおよび/または準備済みステートメントとバインドされた変数を使用して、同じ概念値がデータベースに正確に表現されるようにします。XML ファイルに保存する場合は、XML でエンコードされていることを確認してください。
表現の境界を越えるときに正しく変換できないことは、SQL インジェクション攻撃などのインジェクション攻撃の原因となります。複数の表現/言語 (Java、SQL、HTML、Javascript、XML など) を扱う場合は常に、この点に注意してください。
--
一方、本当に HTML ページのフラグメントをデータベースに保存しようとしているのであれば、「保存する前にエンコードする」という意味がよくわかりません。厳密に有効な HTML である場合、必要な値はすべて既にエンコードされているはずです (例: &
、<
など)。
実際には、表示前に HTML エンコードします。
表示する前のエンコードについて一貫性がある場合は、適切なXSS
防止策を講じています。
元のフォームをデータベースに保存する必要があります。これによりオリジナルが保持され、エンコードされたバージョンではなく、それに対して他の処理を行うことができます。
入力でのデータベース ベンダー固有のエスケープ、出力での html エスケープ。
表示時にデコードする必要があると考えるすべての人に同意しません。データベースに到達する前にエンコードされた場合に攻撃が発生する可能性は、開発者が表示する前にデコードすることを意図している場合にのみ可能です。ただし、提示する前にデコードすると、新入社員や不適切な実装など、他の初心者開発者によって発生する可能性が常にあります。エンコードされていない状態でそこに座っていると、インターネット上に飛び出してヘルペスのように広がるのを待っているだけです。元のデータを失う心配はありません。エンコード + デコードは、毎回同じデータを生成する必要があります。ちょうど私の2セント。
セキュリティ上の理由から、はい、最初にhtmlをエンティティに変換してからデータベースに挿入する必要があります。XSSなどの攻撃は、ユーザー (またはむしろ悪者) に html タグの使用を許可し、それらを処理/データベースに挿入すると開始されます。XSS は、ほとんどのセキュリティ ホールの根本原因の 1 つです。したがって、保存する前にhtmlをエンコードする必要があります。