23

入力データのフィルタリングとサニタイズの問題に取り組む準備をしているので、ベスト (または最も使用されている) プラクティスがあるかどうか知りたいです。データベースにデータを挿入する前に (HTML、JavaScript などの) データをフィルター処理/サニタイズする方が良いですか、それともデータを HTML で表示する準備をしているときに行うべきですか?

いくつかのメモ:

  • 私はこれをPHPで行っていますが、これに対する答えは言語に依存しないと思います。ただし、PHP に固有の推奨事項があれば、共有してください。
  • これは、データベース挿入のためにデータをエスケープする問題ではありません。私はすでにそれをうまく処理しているPDOを持っています。

ありがとう!

4

6 に答える 6

18

ユーザーが送信したデータを表示する場合、一般的に受け入れられているマントラは、「入力をフィルター処理し、出力をエスケープする」ことです。

HTML がいつ表示媒体にならなくなるか分からないので、データベースに入る前に html エンティティなどをエスケープしないことをお勧めします。また、さまざまなタイプの状況では、さまざまなタイプの出力エスケープが必要です。たとえば、Javascript に文字列を埋め込むには、HTML とは異なるエスケープが必要です。事前にこれを行うと、誤った安心感に陥る可能性があります。

したがって、基本的な経験則は、使用前に、特にその使用のために消毒することです。先制ではありません。

(注意してください、SQL の出力をエスケープすることについて話しているのではなく、単に表示するためです。SQL 文字列にバインドされたデータをエスケープしてください)。

于 2009-08-13T21:10:48.140 に答える
12

データを元の形式で保持/保存するのが好きです。使用している場所に応じて、データをエスケープ/フィルタリングするだけです。

  • Web ページで - すべての html をエンコードする
  • SQL で - 引用符を削除します
  • URL - urlencoding
  • プリンターで - エスケープ コマンドをエンコードする
  • 何にでも - その仕事のためにそれをエンコードする
于 2009-08-13T21:10:00.387 に答える
7

注意すべきフィルタリング/サニタイズには、少なくとも 2 つのタイプがあります。

  • SQL
  • HTML

明らかに、最初のものは、SQL インジェクションを防ぐために、データベースにデータを挿入する前/挿入するときに処理する必要があります。
しかし、あなたが言ったように、あなたはすでにそれを知っているので、私はそれについてこれ以上話しません.


一方、2 番目の質問は、より興味深い質問です。

  • ユーザーが自分のデータを編集できるようにする必要がある場合は、最初に入力したのと同じ方法でデータを返すのは興味深いことです。つまり、「非 html-specialchars-escaped」バージョンを保存する必要があります。
  • HTML を表示したい場合は、おそらくHTMLPurifierのようなものを使用します。非常に強力です...しかし、表示する必要があるときにすべてのデータでそれを実行している場合は、少しリソースが多すぎる可能性があります...

そう :

  • 重いツールを使用して検証/フィルタリングするHTMLを表示したい場合は、サーバーを破壊しないように、すでにフィルタリングされている/何らかのバージョンをデータベースに保存し、データが表示されています
    • ただし、「元の」バージョンも保存する必要があります(前に言ったことを参照してください)
    • その場合、より多くの場所が必要になるとしても、おそらく両方のバージョンをデータベースに保存します...または、少なくとも適切なキャッシュメカニズムを使用して、クリーンなバージョンを何度も再作成しないようにします。
  • HTML を表示したくない場合は、htmlspecialcharsまたは同等のものを使用しますが、これはおそらくそれほど CPU を消費しません...したがって、おそらくそれほど問題ではありません
    • 「元の」バージョンを保存する必要があります
    • ただし、データを出力しているときにエスケープしても問題ない場合があります。

ところで、最初の解決策は、ユーザーがデータを入力するときに bbcode/markdown/wiki などを使用していて、それを HTML でレンダリングしている場合にも便利です...
少なくとも、更新されるよりも頻繁に表示される限り - そして特に、クリーンな HTML バージョンを格納するためにキャッシュを使用しない場合。

于 2009-08-13T21:11:05.300 に答える
6

私はいつも、エスケープする必要がある場所に渡す直前に、エスケープすると言います。データベースは HTML を気にしないので、データベースに格納する前に HTML をエスケープする必要はありません。HTML 以外の形式で出力したい場合や、許可/禁止するタグを変更したい場合は、少し手間がかかるかもしれません。また、プロセスのかなり早い段階よりも、必要なときにエスケープを行うことを覚えておく方が簡単です。

HTML エスケープされた文字列は、元の入力よりもはるかに長くなる可能性があることにも注意してください。登録フォームに日本語のユーザー名を入力すると、元の文字列は Unicode の 4 文字しかない場合がありますが、HTML エスケープによって「〹ल䡈穩」のような長い文字列に変換される場合があります。 . 次に、私の 4 文字のユーザー名はデータベース フィールドには長すぎて、日本語 2 文字と半分のエスケープ コードとして保存され、ログインできなくなる可能性があります。

ブラウザは、送信されたフォーム自体で英語以外のテキストなどをエスケープする傾向があることに注意してください。日本語のユーザー名をどこにでも使用する賢い人が常にいます。そのため、保存する前に実際に HTMLのエスケープを解除したい場合があります。

于 2009-08-13T22:00:12.980 に答える
6

必要に応じて、データベースに配置する前にデータベース用にサニタイズします (つまり、それを処理するデータベース対話レイヤーを使用していない場合)。展示前に展示用に消毒してください。

現在不要な引用形式で物事を保存すると、あまりにも多くの問題が発生します。

于 2009-08-13T21:10:37.687 に答える
4

ほとんどの場合、入力に対して何をしようとしているのか、また開発環境によって異なります。

ほとんどの場合、オリジナルの入力が必要です。このようにして、オリジナルを失うことを恐れることなく、心ゆくまで出力を微調整することができます。これにより、出力の破損などの問題をトラブルシューティングすることもできます。フィルターにバグがあるか、顧客の入力が間違っているかを常に確認できます。

一方、一部の短いセマンティック データはすぐにフィルタリングできます。1)データベースに乱雑な電話番号を入れたくないので、そのようなものについてはサニタイズするとよいでしょう。2) 他のプログラマーがエスケープせずに誤ってデータを出力することを望まず、マルチプログラマー環境で作業している。ただし、ほとんどの場合、生データの方が優れています。

于 2009-08-13T21:14:08.240 に答える