GETリクエストを使用してサイトに変数を渡す場合、使用する前に変数を検証しますか(正規表現、フィルターなど)?
URLhttp ://www.example.com/i=45&p=custformがあるとします。「i」は常に整数であり、「p」には常に文字や数字のみが含まれることをご存知でしょう。誰も値を操作してからページを再送信しようとしていないことを確認するのに時間の価値がありますか?
GETリクエストを使用してサイトに変数を渡す場合、使用する前に変数を検証しますか(正規表現、フィルターなど)?
URLhttp ://www.example.com/i=45&p=custformがあるとします。「i」は常に整数であり、「p」には常に文字や数字のみが含まれることをご存知でしょう。誰も値を操作してからページを再送信しようとしていないことを確認するのに時間の価値がありますか?
はい。疑いなく。ユーザー入力を絶対に信用しないでください。
ユーザーエクスペリエンスを向上させるために、入力フィールドをクライアントで検証できます(IMHOが検証する必要があります)。これにより、サーバーへのラウンドトリップがプリエンプトされ、同じフォームとエラーメッセージのみが表示される可能性があります。
ただし、ユーザーはGET URLで入力データを手動で変更するか、細工したPOSTデータを送信するだけなので、入力は常にサーバー側で検証する必要があります。
最悪のシナリオでは、SQLインジェクション、さらに悪いことにXSSの脆弱性が発生する可能性があります。
ほとんどのフレームワークには、入力をクリーンアップするための組み込みの方法がすでにありますが、これがなくても、通常、通常の例外とルックアップテーブルの組み合わせを使用して入力をクリーンアップするのは非常に簡単です。
他のユーザー入力と同様に、それが期待どおりであることを確認することは非常に重要です。あ、はい!
はい、はい、そして3回はい。
もちろん、Struts 2など、多くのWebフレームワークがこれを行います。
重要な理由の 1 つは、SQL インジェクションのチェックです。はい、常にユーザー入力をサニタイズします。
他の人が言っていることだけではありません。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 になります。
これがいかに重要かを強調したい。最初の回答で SQL インジェクションと XSS の脆弱性について説明したことは知っています。SQL インジェクションの最新の絶賛は、クエリ文字列でバイナリ エンコードされた SQL ステートメントを渡すことです。SQL インジェクション ホールが見つかると、データベース内のすべてのテキスト フィールドに http://reallybadsite.com'/> が追加されます。
Web 開発者として、すべての入力を検証し、すべての出力をクリーンアップする必要があります。
ハッカーが IE を使用してサイトを侵害することはないので、Web の検証に頼ることはできません。
はい、できる限り徹底的にチェックしてください。PHP では、常に型 ( IsInt(i), IsString(p)
) をチェックします。