4

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

「入力をフィルタリングする」、「入力をサニタイズする」と書いている人が常にいますが、ユーザーデータを信頼していませんが、外部データを信頼することは、内部データであっても悪い考えだと考える最後のデータにのみ同意します。システム。

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

ただし、データをフェッチするときは、データベースからの生データを使用するだけです。

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

出力フィルタリング: この方法で行う場合、プリペアドステートメントを含む未変更の未変更データをデータベースに保存し、データにアクセスするときに問題のあるコードをフィルターで除外します。これには独自の利点があります。 これにより、html間にレイヤーが追加されます。およびサーバー側スクリプト。 これは、ある種のデータアクセスの分離であると私は考えています。

これで、データはコンテキストに応じてフィルタリングされます。たとえば、データベースのデータをhtmlドキュメントにプレーンエスケープテキスト、html、またはその他の場所で表示できます。

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

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

したがって、「入力をフィルタリングする」のではなく、「入力を検証し、出力をフィルタリングする」必要があります。

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

4

3 に答える 3

4

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

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

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

エスケープはコンテキストの問題であり、特定の文字を挿入することによって汚染される可能性のあるデータを使用して何かをしている場合にのみ、実際に意味があります。ブラウザに送信するデータのHTML文字をエスケープします。データベースに送信するデータのSQL文字をエスケープします。<script>JavaScriptタグ内にデータを書き込む場合は、引用符をエスケープします。処理しているデータが、データを渡すシステムによってどのように解釈され、それに応じてエスケープされるかを意識してください。

于 2010-10-14T19:31:06.460 に答える
0

最善の解決策は、両方をフィルタリングすることです。1つだけ実行すると、ケースを見逃す可能性が高くなり、他のタイプの攻撃にさらされる可能性があります。

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

出力フィルタリングのみを行う場合は、SQLインジェクションやその他のサーバー側の攻撃にさらされる可能性があります。

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

于 2010-10-14T19:29:22.940 に答える
-1

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

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

代替テキスト

于 2010-10-14T19:29:58.547 に答える