2009-08-13 8 views
17

私は入力データのフィルタリングとサニタイズの問題に取り組むために、最良の(または最もよく使用される)プラクティスがあるかどうか不思議です。データをデータベースに挿入する前に、HTML、JavaScriptなどのデータをフィルタリング/サニタイズする方が良いのですか、データをHTMLで表示する準備が整った時点で処理する必要がありますか?データをフィルタリング/サニタイズする場合:データベース挿入前または表示前?

いくつかの注意事項:

  • 私はPHPでこれをやっているが、私はこの答えは、言語に依存しないで疑います。しかし、PHPに固有の推奨事項がある場合は、共有してください!
  • これは、データベース挿入用のデータをエスケープする問題ではありません。私はすでにPDOをかなりうまく処理しています。

ありがとう!

+0

私の答えを参照してください:http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php/130323#130323 – troelskn

答えて

17

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

HTMLが表示メディアにならないことは決してないので、データベースに入る前にhtmlエンティティなどのエスケープを避けることをおすすめします。また、さまざまなタイプの状況では、異なるタイプの出力がエスケープされる必要があります。たとえば、Javascriptに文字列を埋め込むには、HTMLとは異なるエスケープが必要です。これを行う前に、セキュリティの誤った感覚に自分自身をだますかもしれません。

したがって、基本的な経験則は、使用前、特にその使用のために浄化されます。先制的ではありません。

(私は、SQLの出力をエスケープすることについてだけではなく、表示のためにエスケープすることについて言及していません。

+0

+1全体的に優れたチップ、特に「HTMLがあなたの表示媒体にならないことを知らないので、データベースに入る前にhtmlエンティティなどのエスケープをすることをお勧めします。」 – Jeach

8

私は元の形式でデータを持っています。 私はそれを使用している場所に応じてデータをエスケープ/フィルタリングするだけです。 Webページ上の

  • - SQLのすべてのhtml
  • をエンコードする - URLへの引用符
  • を殺す - プリンタで
  • をURLエンコード - そのジョブ
  • のためにそれをエンコードする - エンコードエスケープは、これまで何の
  • コマンド
6

データベースに保存する前に、必要に応じてデータベースのサニタイズを行います(つまり、データベースインタラクティビティレイヤを使用していない場合)。表示する前に消毒して表示してください。

現在は不要な引用形式で物事を保存するだけで問題が多すぎます。

6

あなたが気にする必要があり、フィルタリング/サニタイズの少なくとも2つのタイプがあります。

明らか

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


    秒1は、一方で、より興味深い質問です:

    • ユーザーが自分のデータを編集することができなければならない場合、同じように彼らにそれを返すことは興味深いです、彼ら最初に入力した。これは、 "非html-specialchars-escaped"バージョンを保存する必要があることを意味します。
    • もしいくつかのHTMLを表示したいのであれば、HTMLPurifierのようなものを使うことができます:非常に強力です。表示する必要があるときには、すべてのデータでそれを実行すると、 。

    ので:

    • あなたはそれをフィルタリング/検証するための重ツールを使用して、いくつかのHTMLを表示したい場合は、私はあなたがデータベースにすでにフィルタ/どんなバージョンを格納する必要があるでしょうね、サーバーを破棄せずに、データが表示されるたびに再作成します。
      • しかし、あなたはまた、その場合には、「オリジナル」バージョン(私が前に言ったものを参照してください)
      • を格納する必要があり、私はおそらくそれがより行われていても、データベースに両方のバージョンを保存したいです...かクリーンなバージョンを何度も何度も作り直さないように、少なくとも良いキャッシュ手法を使用してください。
    • あなたが任意のHTMLを表示したくない場合は、おそらくCPU-食べる人のことあまりないですhtmlspecialcharsまたは同等のものを使用します...だからそれはおそらくあまり重要
        ありません
      • "オリジナル"のバージョンを保存する必要があります。
      • 出力中にエスケープすると、データが正常である可能性があります。

    として、少なくとも
    ...データを入力する際に​​、ユーザーがBBコード/値下げ/ wikiのようなものを使用している、とあなたがHTMLでそれをレンダリングしている場合ところで、最初のソリューションもいいです更新されるよりも頻繁に表示されるので、特に、クリーンなHTMLバージョンを保存するためにキャッシュを使用しない場合は、そうです。

+0

(Re:墨塗りHTMLを具体的に)8年後、あなたがすでにフィルタリングされた/どんなバージョンでもデータベースに保存して、サーバを破壊しないようにする必要があると言いたいのですが、ここでのポイントはさらに重要です。 HTMLのサニタイズはコストのかかる操作であり、多くの場合、表示時ではなく保存時にサニタイズする方が理にかなっています。ここでは明らかなトレードオフがありますが、処理が損なわれたり、サニタイズルールを更新するためにデータの移行が必要になったりしますが、これらのトレードオフが価値のあるもの以上のケースが数多くあります。 –

3

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

ほとんどの場合、元の入力が必要です。この方法で、オリジナルを失うことを心配することなく、あなたの心のコンテンツにあなたの出力を微調整する力​​を得ることができます。これにより、出力が壊れるなどの問題のトラブルシューティングも可能になります。フィルタのバグや顧客の入力が間違っていることはいつでもわかります。

一方、いくつかの短い意味データを直ちにフィルタリングすることができました。 1)あなたはデータベースに厄介な電話番号を望んでいないので、そのようなことについては衛生的にするのが良いかもしれません。 2)他のプログラマがエスケープせずに誤ってデータを出力することを望まず、マルチプログラマ環境で作業します。しかし、ほとんどの場合、生データはより良いIMOです。

5

私はいつもエスケープする必要がある場所にそれらを渡す直前にエスケープすることを言います。データベースはHTMLを気にしないので、データベースに保存する前にHTMLをエスケープする必要はありません。HTML以外のものとして出力したい場合や、許可/禁止するタグを変更したい場合は、少し前に作業をすることができます。また、プロセスのもっと早い段階で行うよりも、実行する必要があるときにエスケープする権利を忘れない方が簡単です。

HTMLエスケープ文字列が元の入力文字列よりもはるかに長くなる可能性もあります。日本のユーザー名を登録フォームに入れた場合、元の文字列は4つのUnicode文字にすぎないかもしれませんが、HTMLエスケープでは "〹 𐤲 䡈 穩 。その後、私の4文字のユーザ名はあなたのデータベースフィールドには長すぎます。また、2つの日本語文字とエスケープコードの半分を格納してしまい、ログインできなくなる可能性があります。

ブラウザは、 - 提出されたフォーム自体に英語のテキストがあり、いつでもどこでも日本語のユーザー名を使用するスマートスがあります。だから実際にエスケープ HTMLを保存する前に保存することがあります。

関連する問題