質問

出力または入力フィルタリング?

「入力をフィルター」、「入力を消毒する」と書いている人が絶えず見ています。ユーザーデータを信頼しないでください。しかし、私は最後のデータにのみ同意します。システム。

入力フィルタリング:私が見る最も一般的なもの。フォームの投稿データまたはその他の外部情報源を取得し、それを保存するときにいくつかの境界を定義します。たとえば、テキストがテキストであることを確認すること、数字が数字であること、SQLが有効なSQL、HTMLは有効なHTMLであり、有害なものが含まれていないことマークアップしてから、データベースに「安全な」データを保存します。

ただし、データを取得するときは、データベースから生データを使用するだけです。

私の個人的な意見では、データは決して安全ではありません。簡単に聞こえますが、フォームやURLから得られるものすべてをフィルタリングするだけで、実際にはそれよりもはるかに難しいですが、ある言語では安全ではありませんが、別の言語ではありません。

出力フィルタリング:この方法でそれを行うとき、私はそれが何であれ、生の未変化データを保存し、データベースに準備されたステートメントを使用して、データにアクセスするときに問題のあるコードを除外します。これには、独自の利点があります。これにより、HTMLとサーバーサイドスクリプトの間にレイヤーが追加されます。これは、種類のデータアクセス分離であると考えています。

これで、コンテキストに応じてデータがフィルタリングされます。たとえば、データベースのデータをHTMLドキュメントでプレーンエスケープテキストとして、またはHTMLとして、またはどこでも何かとして表示できます。

ここでの欠点は、入力フィルタリングよりも少し難しいフィルタリングを追加することを忘れないでください。データを提供するときにもう少しCPUを使用します。

これは、検証チェックを実行する必要がないという意味ではありません。それでも、フィルタリングされたデータを保存せず、検証し、データが何らかの形で無効な場合はユーザーにエラーメッセージを提供します。

したがって、「入力をフィルター」する代わりに、「入力を検証し、出力をフィルタリングする」必要があるかもしれません。

それでは、「入力検証とフィルタリング」または「入力検証と出力フィルタリング」を使用する必要がありますか?

役に立ちましたか?

解決

入力と出力用の一般的な「フィルタリング」はありません。

入力を検証し、出力をエスケープします。これをどのように行うかは、コンテキストに依存します。

検証とは、文字列の長さ、ドルの金額の数値、または更新されるレコードが更新を実行するユーザーが所有するように、入力が賢明な範囲内にあることを確認することです。これは、データの論理的な一貫性を維持し、人々が購入している製品の価格をゼロにしたり、アクセスできないレコードを削除したりすることを防ぐことです。 「フィルタリング」または入力の特定の文字を逃れることとは何の関係もありません。

逃げることは文脈の問題であり、特定の文字を注入することで毒される可能性のあるデータを使用して何かをしている場合にのみ、本当に理にかなっています。ブラウザに送信するデータでHTML文字をエスケープします。データベースに送信するデータのSQL文字をエスケープします。 JavaScript内にデータを書いているときに引用符を逃がします <script> タグ。あなたが扱っているデータがどのようにそれを渡すシステムによって解釈されるかを意識して、それに応じて逃げることができます。

他のヒント

最良の解決策は、両方をフィルタリングすることです。 1つだけを行うと、ケースを逃し、他の種類の攻撃に開放される可能性が高くなります。

入力フィルタリングのみを行う場合、攻撃者は入力をバイパスして脆弱性を引き起こす方法を見つけることができます。これは、データベースに手動でデータを入力することができる人である可能性があります。これは、FTPまたはチェックされていない他のチャネル、または他の多くの方法を介してファイルをアップロードする攻撃者である可能性があります。

出力フィルタリングのみを行う場合は、SQLインジェクションやその他のサーバーサイド攻撃に自分自身を開いたままにしておくことができます。

最良の方法は、入力と出力の両方をフィルタリングすることです。より多くの負荷を引き起こす可能性がありますが、攻撃者が脆弱性を見つけるリスクを大幅に減らします。

私にはセマンティクスのように聞こえます。いずれにせよ、覚えておくべき重要なことは、悪いデータがシステムに入っていないことを確認することです。

入力フィルタリングの代わりに出力フィルタリングを行うことは、SQLインジェクションを要求しています。

alt text

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top