出力または入力フィルタリング?
「入力をフィルタリングする」、「入力をサニタイズする」と書いている人が常にいますが、ユーザーデータを信頼していませんが、外部データを信頼することは、内部データであっても悪い考えだと考える最後のデータにのみ同意します。システム。
入力フィルタリング: 私が見る最も一般的なもの。データまたはその他の外部情報ソースのフォームを取得し、保存するときにいくつかの境界を定義します。たとえば、テキストがテキスト、数字が数字、SQLが有効なSQL、HTMLが有効なHTMLであり、有害なものが含まれていないことを確認します。マークアップしてから、「安全な」データをデータベースに保存します。
ただし、データをフェッチするときは、データベースからの生データを使用するだけです。
私の個人的な意見では、データは決して本当に安全ではありません。簡単に聞こえますが、フォームとURLから取得するすべてのものをフィルタリングするだけです。実際には、それよりもはるかに困難です。ある言語では安全かもしれませんが、別の言語では安全ではないかもしれません。
出力フィルタリング: この方法で行う場合、プリペアドステートメントを含む未変更の未変更データをデータベースに保存し、データにアクセスするときに問題のあるコードをフィルターで除外します。これには独自の利点があります。 これにより、html間にレイヤーが追加されます。およびサーバー側スクリプト。 これは、ある種のデータアクセスの分離であると私は考えています。
これで、データはコンテキストに応じてフィルタリングされます。たとえば、データベースのデータをhtmlドキュメントにプレーンエスケープテキスト、html、またはその他の場所で表示できます。
ここでの欠点は、入力フィルタリングよりも少し難しいフィルタリングを追加することを忘れてはならないことと、データを提供するときに少し多くのCPUを使用することです。
これは、検証チェックを実行する必要がないことを意味するのではなく、実行します。フィルタリングされたデータを保存せずに検証し、データが何らかの理由で無効な場合はエラーメッセージをユーザーに提供するだけです。
したがって、「入力をフィルタリングする」のではなく、「入力を検証し、出力をフィルタリングする」必要があります。
では、「入力の検証とフィルタリング」または「入力の検証と出力のフィルタリング」を使用する必要がありますか?