ユーザーからの入力をサニタイズする際に推奨されるアプローチはどれですか?
ありがとう!
WL は、可能な限り BL に対するベスト プラクティスです。
理由は簡単です: 許可されていないものを列挙することは合理的に安全ではありません.攻撃者は常にあなたが考えていなかった方法を見つけることができます. 可能であれば、何が許可されているかを言うと、それはよりシンプルではるかに安全です!
いくつかの質問と回答であなたの質問を説明させてください。
ブラックリストとホワイトリストの制限
私。ブラックリスト XSS および SQL インジェクション処理は、否定的な入力のリストに対して目的の入力を検証します。基本的に、すべての否定的または悪い条件のリストをコンパイルし、受け取った入力が悪いまたは否定的な条件のいずれでもないことを確認します。
ii. ホワイトリスト XSS および SQL インジェクション処理は、可能な正しい入力のリストに対して目的の入力を検証します。これを行うには、すべての良い/正の入力値/条件のリストをコンパイルし、受け取った入力が正しい条件の 1 つであることを確認します。
持っていくならどっちがいい?
私。攻撃者はあらゆる手段を使ってアプリケーションにアクセスします。これには、あらゆる種類の否定的または悪い条件、さまざまなエンコード方法の試行、有効なデータへの悪意のある入力データの追加が含まれます。発生する可能性のある悪い順列をすべて思いつくことができると思いますか?
ii. ホワイトリストは、入力を検証する最良の方法です。何が必要で、悪い型は受け入れられないことを正確に知ることができます。通常、ホワイトリストを作成する最良の方法は、正規表現を使用することです。正規表現を使用すると、可能なすべての正しい値を手動でリストする代わりに、ホワイトリストを抽象化する優れた方法になります。
適切な正規表現を構築します。正規表現を使用しているからといって、不適切な入力が受け入れられないわけではありません。正規表現をテストして、無効な入力が正規表現で受け入れられないことを確認してください。
最適な方法は、ストアド プロシージャまたはパラメーター化されたクエリを使用することです。ホワイトリスティングは、インジェクションがサーバーに到達する前に防ぐための追加の手法ですが、主な防御として使用するべきではありません。通常、すべての悪意のある入力を除外することは不可能であるため、ブラック リストは通常は悪い考えです。
ところで、この回答は、SQLインジェクションを防ぐためのサニタイズを意味すると考えています。
原則として、ホワイトリスト検証を使用するのが最善です。たとえば、ユーザーが自分の電話番号を入力するフィールドがある場合、正規表現を実行して値を確認することができます。受け取ったのは数字だけで、それ以外はすべて破棄して、数字だけを保存します。結果の数値も検証する必要があることに注意してください。OWASP「ブラックリストによるサニタイズ」から、熟練した攻撃者が検証機能を回避したり、機能が予期しない値を送信したりする可能性があるため、ブラックリストの検証は弱くなります。
入力を「安全」にするために、文字を削除または変換します (HTML エンティティへの変換や引用符の削除など)。ブラックリストと同様に、このアプローチにはメンテナンスが必要であり、通常は不完全です。ほとんどのフィールドには特定の文法があるため、現在および将来のすべての攻撃に対して複雑で時間のかかるサニタイズ ルーチンを含めようとするよりも、単一の正しい陽性テストを単純に検証する方が簡単で、高速で、安全です。
この検証は、攻撃に対する最前線の防御にすぎないことを認識してください。XSS の場合、常に出力を「エスケープ」して、必要な文字を印刷できるようにする必要がありますが、エスケープされているため、HTML エンティティに変更されているため、ブラウザはそれがデータであり、パーサーが解釈すべきものではないことを認識しているため、すべてを効果的にシャットダウンしますXSS 攻撃。SQL インジェクションでは、すべてのデータを保存する前にエスケープします。動的クエリは、最も悪用されやすいタイプのクエリであるため、決して使用しないようにしてください。パラメータ化されたストア プロシージャを使用してみてください。また、接続が行う必要があることに関連する接続を使用することも忘れないでください。接続でデータの読み取りのみが必要な場合は、「読み取り」権限のみを持つ db アカウントを作成します。これは主にユーザーの役割に依存します。
個人的には、許可されている文字と許可されていない文字の数を測定し、そこから進みます。許可されていない文字よりも許可されている文字が多い場合は、ブラックリストに登録します。そうでなければホワイトリスト。どちらかの方法で行うべきだと言う「標準」があるとは思いません。
ところで、この回答は、電話番号や名前などのフォームフィールドへの入力を制限したいことを前提としています:) @posterBelow
答えは一般的に、場合によって異なります。
明確に定義されたパラメーター (ドロップダウン メニューに相当するもの) を持つ入力の場合、オプションをホワイトリストに登録し、それらのいずれでもないものはすべて無視します。
フリーテキスト入力の場合は、かなり難しくなります。私は、できる限り安全に (HTML をエスケープするなど) できる限りフィルタリングする必要があるという考え方に同意します。他の提案としては、無効な入力を明確に禁止することも考えられますが、これは攻撃から保護する可能性がありますが、本物のユーザーの使いやすさにも影響を与える可能性があります。
自分に合ったブレンドを見つければいいだけの話だと思います。すべての可能性に有効な 1 つの解決策は考えられません。ほとんどの場合、ユーザーベースに依存します。