9

GETリクエストを使用してサイトに変数を渡す場合、使用する前に変数を検証しますか(正規表現、フィルターなど)?

URLhttp ://www.example.com/i=45&p=custformがあるとします。「i」は常に整数であり、「p」には常に文字や数字のみが含まれることをご存知でしょう。誰も値を操作してからページを再送信しようとしていないことを確認するのに時間の価値がありますか?

4

7 に答える 7

41

はい。疑いなく。ユーザー入力を絶対に信用しないでください。

ユーザーエクスペリエンスを向上させるために、入力フィールドをクライアントで検証できます(IMHOが検証する必要があります)。これにより、サーバーへのラウンドトリップがプリエンプトされ、同じフォームとエラーメッセージのみが表示される可能性があります。

ただし、ユーザーはGET URLで入力データを手動で変更するか、細工したPOSTデータを送信するだけなので、入力は常にサーバー側で検証する必要があります。

最悪のシナリオでは、SQLインジェクション、さらに悪いことにXSSの脆弱性が発生する可能性があります。

ほとんどのフレームワークには、入力をクリーンアップするための組み込みの方法がすでにありますが、これがなくても、通常、通常の例外とルックアップテーブルの組み合わせを使用して入力をクリーンアップするのは非常に簡単です。

  • 整数であることがわかっている場合は、int.Parseを使用するか、正規表現「^ \ d+$」と照合します。
  • 文字列で選択肢が限られている場合は、辞書を作成して文字列を実行します。一致するものがない場合は、文字列をデフォルトに変更します。
  • ユーザー指定の文字列の場合は、「^ \ w+$」などの厳密な正規表現と照合します
于 2008-10-07T13:02:41.040 に答える
4

他のユーザー入力と同様に、それが期待どおりであることを確認することは非常に重要です。あ、はい!

于 2008-10-07T13:03:03.907 に答える
4

はい、はい、そして3回はい。

もちろん、Struts 2など、多くのWebフレームワークがこれを行います。

于 2008-10-07T13:03:05.983 に答える
3

重要な理由の 1 つは、SQL インジェクションのチェックです。はい、常にユーザー入力をサニタイズします。

于 2008-10-07T13:05:54.293 に答える
2

他の人が言っていることだけではありません。nc という名前のクエリ文字列変数を想像してみてください。ユーザーがページごとに 10、50、100 の結果をそれぞれ選択すると、値が 10、50、100 になることがわかります。誰かがこれを 50000 に変更したとします。整数であることを確認するだけであれば、ページあたり 50000 件の結果が表示され、ページビュー、サーバーの負荷、スクリプト時間などに影響します。さらに、これはデータベース全体である可能性があります。そのようなルール (1 ページあたり 10、50、または 100 の結果) がある場合、nr の値が 10、50、または 100 のみであるかどうかをさらに確認し、そうでない場合はデフォルトに設定する必要があります。これは単に min(nc, 100) である可能性があるため、nc が 25、75 などに変更された場合は機能しますが、100 を超えるものがある場合はデフォルトで 100 になります。

于 2008-10-07T13:30:18.813 に答える
1

これがいかに重要かを強調したい。最初の回答で SQL インジェクションと XSS の脆弱性について説明したことは知っています。SQL インジェクションの最新の絶賛は、クエリ文字列でバイナリ エンコードされた SQL ステートメントを渡すことです。SQL インジェクション ホールが見つかると、データベース内のすべてのテキスト フィールドに http://reallybadsite.com'/> が追加されます。

Web 開発者として、すべての入力を検証し、すべての出力をクリーンアップする必要があります。

ハッカーが IE を使用してサイトを侵害することはないので、Web の検証に頼ることはできません。

于 2008-10-08T14:45:43.980 に答える
0

はい、できる限り徹底的にチェックしてください。PHP では、常に型 ( IsInt(i), IsString(p)) をチェックします。

于 2008-10-07T13:13:51.360 に答える