web-dev-qa-db-ja.com

ユーザー入力データのフィルタリングで十分ですか、それとも解析する必要がありますか?

Webアプリケーションでは、XSS攻撃を緩和するために2つのアプローチが考えられます。

  • すべての入力データをフィルタリングできます(すべての「不良」データを削除します)、または
  • 入力は解析され、トークン化され、許可されたタグのみで出力されます。

セキュリティの観点から、どちらの方法をお勧めしますか?

どちらの方法でも、問題点は何ですか?

28
Peter Smit

入力の検証には、パスリストまたは拒否を組み合わせたホワイトリストアプローチをお勧めします。したがって、有効なものを定義し、有効な入力のみを受け入れ、その他はすべて拒否します。

HTMLをサーバーに送信するリッチテキストエディターを構築する場合、JavaScriptを使用して入力をサニタイズできるため、WordからのHTMLの貼り付けが機能する可能性があります。しかし、サーバーは無害化された入力を受け入れません。

クリーンアップしようとすると、通常、入力が有効かどうかを判断するよりもはるかに複雑になるため、障害が発生しやすくなります。

優れたセキュリティにはホワイトリスト登録が不可欠です。制御を維持しながら、常により多くの入力を受け入れることを決定できます。ブラックリストのアプローチでは、常に最新のハッキングに追いつく必要があります。

出力については、他の回答を参照してください。

18
Jörn Zaefferer

検証について@Jornの answer に同意します。

ただし、ここではvery重要なステップを忘れていますが、それはoutput encodingです。
例えば。何かを出力する前のHTMLエンコーディング(または属性エンコーディング、Javascriptエンコーディングなど)...実際、これは間違いなく入力検証よりももっと重要です(間違いなく、絶対ではありませんが、そして、すべての状況で間違いなく...)
どのような場合でも、どちらか一方または両方にすることはできません。厳密に、両方とも厳密な入力検証+出力エンコーディングです。

ここで、出力に「安全な」HTMLタグを含めることを言及している場合(質問ではそれほど明確ではありません)、引き続きすべてをエンコードし、デコードする必要がありますあなたが探している特定のタグタグの属性なし.

追伸.NETアプリを参照している場合、MSのAntiXSS(WPL)は.GetSafeHTMLXXXメソッドのセット。

19
AviD

あなたの質問「ユーザー入力データ、フィルタリングは十分ですか、それとも解析する必要がありますか?」 XSSの場合よりも一般的です。あなたはXSSに特化したいと思いますが、通常、ユーザー入力はSQLインジェクション、パストラバーサル、XSSなどの多くのエクスプロイトを引き起こす可能性があります...質問がXSSでより具体的になると、私はすでに言ったことを参照して行きます [〜#〜] owasp [〜#〜] によって提供されるようないくつかの既知の対策を備えた入力フィルタリングと出力エンコーディング(常にサーバー側!!)。

それでも、チェックされていない入力が原因で発生する可能性があるSQLインジェクションを解決する最良の方法は、パラメーター化されたクエリ( SQLインジェクション防止チートシート )であり、パストラバーサルの脆弱性を検討する場合に指摘します。 、私のアプローチはいくつかのホワイトリストのアプローチになります。

5

質問は広すぎます。最良の答えは次のとおりです。これは、ユーザーデータの形式、および適用しているセキュリティポリシーによって異なります。

  • たとえば、SQLクエリにユーザーデータを含める場合、最良の答えは準備されたステートメントを使用することです。

  • たとえば、HTMLページにユーザーデータ(フルネームなど)を含める場合は、出力エンコーディングを使用するのが最善の方法です。

  • たとえば、HTMLメールを送信できるWebメールサービスを構築していて、HTMLメールをユーザーに表示したいが、メールにアクティブコンテンツが含まれていない場合にのみ、最良の答えは次のとおりです。解析されたコンテンツの解析とフィルタリング。

最良の答えはドメインによって異なります。より有用な答えを得るには、解決しようとしている具体的な問題の詳細を提供する必要があります。

2
D.W.

ホイールを再発明しないことを強くお勧めします。もちろん、すべてのWeb開発者はセキュリティの基本を知っている必要がありますが、堅牢なソリューションを使用する可能性がある場合は、それを使用してください。独自のフィルターの実装中に、何かを見落とす可能性が高くなります。適切な入力検証は、不良文字を削除することだけではありません-これは複雑なトピックです。とにかく、他に選択肢がない場合は、他のWAFの動作を確認してください。 PHPアプリケーションのよく知られている堅牢なものは http://php-ids.org/ です。攻撃ベクトルについては、「あいまい」であることを思い出させるためだけにそれらは- http://heideri.ch/jso/ です。

1
anonymous