入力の検証や表現の問題は、メタキャラクター、代替エンコーディング、数値表現などによって引き起こされます。セキュリティの問題は、入力を信頼することに起因します。この問題に含まれるのは、「Buffer Overflow」、「Cross-Site Scripting」攻撃、「SQL Injection」などです。
HttpRequest
クラスにより、プログラムは QueryString
、Form
、Cookies
、または ServerVariables
コレクションの変数に配列アクセスの形でアクセスすることができます (Request["myParam"]
など)。同じ名前の変数が 2 個以上存在する場合、.NET フレームワークは次の順序でコレクションを検索して最初に検出した変数の値を返します。QueryString
、Form
、Cookies
、ServerVariables
。QueryString
は最初に検索されるため、QueryString
のパラメーターがフォーム、cookie、およびサーバーの変数の値より優先される可能性があります。同様に、フォームの値は Cookies
と ServerVariables
コレクションの変数より優先され、Cookies
コレクションの変数は ServerVariables
の変数より優先される場合があります。
...
String toAddress = Request["email"]; //Expects cookie value
Double balance = GetBalance(userID);
SendAccountBalance(toAddress, balance);
...
Example 1
のコードが http://www.example.com/GetBalance.aspx
にアクセス中に実行されると仮定してみましょう。攻撃者が認証済みユーザーに http://www.example.com/GetBalance.aspx?email=evil%40evil.com
をリクエストするリンクをクリックさせることができる場合、そのユーザーの口座残高が記載された電子メールは evil@evil.com
に送信されてしまいます。HttpRequest
クラスにより、プログラムは QueryString
、Form
、Cookies
、または ServerVariables
コレクションの変数に配列アクセスの形でアクセスすることができます (Request["myParam"]
など)。同じ名前の変数が 2 個以上存在する場合、.NET フレームワークは次の順序でコレクションを検索して最初に検出した変数の値を返します。QueryString
、Form
、Cookies
、ServerVariables
。QueryString
は最初に検索されるため、QueryString
のパラメーターがフォーム、cookie、およびサーバーの変数の値より優先される可能性があります。同様に、フォームの値は Cookies
と ServerVariables
コレクションの変数より優先され、Cookies
コレクションの変数は ServerVariables
の変数より優先される場合があります。www.example.com
からリクエストが送信されたことを確認するために、HTTP リファラー ヘッダーのサーバー変数をチェックしています。
...
if (Request["HTTP_REFERER"].StartsWith("http://www.example.com"))
ServeContent();
else
Response.Redirect("http://www.example.com/");
...
Example 1
のコードが http://www.example.com/ProtectedImages.aspx
にアクセス中に実行されると仮定してみましょう。攻撃者がこの URL に対して直接リクエストを送信すると、適切なリファラーヘッダーが設定されず、そのリクエストは失敗します。しかし、攻撃者が必要な値を持つ偽の HTTP_REFERER
パラメーター (http://www.example.com/ProtectedImages.aspx?HTTP_REFERER=http%3a%2f%2fwww.example.com
など) を送信した場合には、このルックアップによって ServerVariables
ではなく QueryString
の値が返され、チェックに合格することになります。