web-dev-qa-db-ja.com

入力の無害化と出力の無害化

これについて私が検索したビットの中で、出力ではなく入力のみをサニタイズする必要があることを神の言葉として宣言する人が何人かいます。どうして?両端をカバーする方が安全ではないでしょうか?

21
Todd Schwine

入力を無害化すると、データが使用できなくなる可能性のある方法でデータが変更されるリスクがあります。したがって、データの性質が不明な場合、入力のサニタイズは回避されます。たとえば、おそらく一部の特殊文字はデータに重要性を持ち、それらを取り除くことはその重要性を破壊することを意味します。

このようなシナリオでは、システムにデータが保存され、後でサードパーティのシステムに引き出される可能性があります。そのシステムでは、これらの文字に意味があります。それらを取り除くことで、重要な方法でデータを変更しました。たとえば、おそらく文字列はサードパーティシステムでレコードを検索するためのキーとして使用され、記号を取り除くことにより、レコードが見つからないようにキーを変更します。

入力のサニタイズは、データの性質がわかっていて、サニタイズによってデータに悪影響が及ばない場合に使用できます。

入力データをサニタイズするというあなたの決定は、部分的にはビジネス上の決定です。サードパーティのシステムは、提供されているとおりに入力に依存しますか?もしそうなら、それはおそらく良い考えではありません。ただし、第三者と共有する特定の基準に基づいて入力データをサニタイズすることをサードパーティが理解するように、期待を形作ることができる場合があります。

29
saghaulor

ああ...「出力をサニタイズ」。私は実際にその用語が以前に使用されたことを聞いたことがありません。私はこれを行ってきました、ああ、わかりません。少なくとも今では10年以上。 「出力をサニタイズ」しないencode表示されるアプリケーション内の適切なコンテキスト。あなたencode HTML、HTML属性、URL、JavaScriptの出力...出力を "サニタイズ"するという主張は誰も見たことも聞いたこともありません...たとえば、ワイヤーを介してブラウザーに送信できる特定の文字列をホワイトリストに登録またはブラックリストに登録しますか?誰もそれをしません。いずれにせよ、上記の理由により、特定のアプリケーションで特定のデータを正当に使用する方法がわからない場合があります...一部のWebサイト(たとえば、これなど)必須コードをアップロードして、リクエスト/レスポンスライフサイクル内のコードとしてレンダリングできるようにします。たとえば、scriptタグの使用を許可しないことで、コード共有サイトでコードの例をどのように交換できますか?

ちなみに、「データベースを振り返って、悪意のある投稿の数を確認することはできません。」単に真実ではありません。データベースを通過し、悪意のあるコードを「スクラブ」できるスクラバーがあります。私は昨年、大手金融サービス会社のためにそれをしました。

12
RatboySTL

データベースにXSSコンテンツを含めることはリスクです。データベースはアプリケーションによって共有されることを意図しており、Webフロントエンドと比較して長持ちします。

例:新しいインターンがdbの新しいWebアプリで作業を開始し、上司を示します。彼のログインCookieはサンクトペテルブルクにあります。

alterユーザー入力、validateユーザー入力、およびrejectのいずれかを使用して、XSSが含まれている可能性がある場合。 JSoupのような適切なHTMLパーサーを使用すると、これはかなり簡単で高速です。 Hibernate Validatorに組み込まれています。

出力時にユーザー入力をエスケープしてはいけないと言っているのではありません。 XSSの問題の数が多いため、いくつかを見落とすことは明らかに簡単です。

4
Neil McGuigan

入力の検証と出力のサニタイズをお勧めします。そうすることで、有効なデータがデータベースに保存され、ユーザーの側で無害なデータが消費されることを確認できます。

フィールドに日付が必要な場合は、日付を受け取っていることを確認してください。日付、番号、電子メール、郵便番号、電話番号、および多くのフィールドを簡単に検証できます。そうする。

クライアント側でJavaScriptで実行し、サーバー側で再度実行します。クライアント側で検証すると、サーバーに到達するまで待ち、検証されて送り返されるよりもはるかに速くエラーメッセージを生成できます。誰かがクライアント側の検証を無効にしても、あなたはまだカバーされているので、サーバー上でもう一度それを行います。

データを保存する前にサニタイズします-SQLインジェクションの影響を受けたくないでしょう。可能な場合は準備済みステートメントを使用し、可能でない場合はすべての制御文字をエスケープします。

出力側で、バックエンド形式で無害になるようにデータをエンコードします。 HTMLを出力する場合は、特別なHTML文字をすべてエスケープします。 jsonまたはXMLを出力する場合は、それに応じてエンコードを行います。

他の人が言ったように、入力サイズでデータをフィルタリングおよびエンコードするとデータが破壊され、一部のコンテキストでは無害になるデータの一部が削除されたり、危険なデータが保持されたりする可能性があります。入力の検証と出力のエンコードが最善の方法です。

3
ThoriumBR