17

ASP.NET MVC 1.0 には、クロス サイト リクエスト フォージェリのセキュリティ問題を処理するための新しい機能があります。

 <%= Html.AntiForgeryToken() %>
[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
    // ... etc
}

新しいフォームがレンダリングされるたびに、html フォームで生成されたトークンが変化し続けることがわかりました。

これらのトークンがどのように生成されるか知りたいですか? また、何らかのソフトウェアを使用してこのサイトをスキャンすると、別のセキュリティ上の問題が報告されます: セッションが修正されました。なんで?トークンが変更されているため、この問題はどのように発生するのでしょうか?

もう 1 つの関数があります。それは の「salt」ですがantiForgeryToken、トークンの生成に「salt」を使用しなくても、これが何に使用されるかはよくわかっています。トークンは常に変化します。関数?

4

2 に答える 2

21

AntiForgeryToken に関する多くの情報: http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

これは、クロスサイト リクエスト フォージェリ (CSRF) を防ぐためです。[保存] をクリックしてフォームを送信し、サーバー上で何らかのアクションを実行する、つまりユーザーの詳細を保存するのは、ごく標準的な動作です。フォームを送信したユーザーが、そのユーザーであると主張しているユーザーであることをどのようにして確認できますか? ほとんどの場合、Cookie または Windows ベースの認証を使用します。

少し隠れた IFRAME でまったく同じフォームを送信するサイトに攻撃者がおびき寄せたらどうなるでしょうか。Cookie はそのまま送信され、サーバーはその要求を正当な要求と区別しません。(Gmail が発見したように: http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/ )

偽造防止トークンは、ページが生成されるたびに追加の Cookie トークンを作成することで、この形式の攻撃を防ぎます。トークンはフォームと Cookie の両方にあります。フォームと Cookie が一致しない場合、CSRF 攻撃が発生します (攻撃者は上記の攻撃を使用して偽造防止トークンを読み取ることができないため)。

そして、上記の記事から、塩は何をしますか:

Salt は単なる任意の文字列です。異なるソルト値は、異なる偽造防止トークンが生成されることを意味します。これは、攻撃者が何らかの方法で有効なトークンを取得できたとしても、別のソルト値が必要なアプリケーションの他の部分でそれを再利用できないことを意味します。

更新:トークンはどのように生成されますか? ソースをダウンロードし、AntiForgeryDataSerializer、AntiForgeryData クラスを見てください。

于 2009-09-10T00:17:42.947 に答える
1

あなたはいくつかの無関係な問題を尋ねました:

  1. セキュリティ ソフトウェアが「セッションが修正されました」と報告している理由がわかりません。レポートに付属のドキュメントを読んでみてください
  2. 偽造防止トークン:

これは (おそらく) 各リクエストが有効であることを検証するために使用されます。したがって、誰かがページへのリンクを提示しようとすると?x=1、トークンも渡されない場合、リクエストは拒否されます。また、同一商品の重複投稿を防止(する場合があります)します。「投稿」を 2 回クリックすると、トークンが変更される可能性が高く (リクエストごとに)、このケースは次のような方法で検出されます。

Session["nextToken"] = token;
WriteToken(token);

...

if( !Request["nextToken"] == Session["nextToken"] ){
    ...
}

// note: order in code is slightly different, you must take the token
// before regenerating it, obviously

最近では、これ (防御する攻撃) のことを「CSRF」(クロスサイト リクエスト フォージェリ) と呼んでいると思います。

于 2009-09-10T00:11:23.363 に答える