2012-07-03 34 views
8

私はAntiForgeryTokenヘルパーメソッドを使用しています。私がAntiForgeryTokenについて理解していることは、各ユーザーが同じトークンを持ち、別のユーザーが異なるトークンを持つように(すべてのフォームに同じ塩を使用する場合)、セッションベースだということです。私の "問題"は、AntiForgeryTokenが同じユーザーのために同じ塩で異なるトークンを生成しているということです。たとえば...要求ごとにAntiForgeryTokenの変更

Contoller

public ActionResult Test() 
{ 
    return View(); 
} 

ビュー

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken("Salty!") 
} 

出力要求#1

<input name="__RequestVerificationToken" type="hidden" value="K1sijFuYvyGUJjGg33OnLjJaU3tFpGFDutRt9TOFSkZ6FcrhJMMQPnOqjIHuTwBXs/sPBXEiE+1qyV9l63nnSO161b+OtLbaBoPC7K3/7wxtnuSY+N0o/fqBgVoDyac4dNVp+OvanKBSrHINKfc3WEg9269BHOJNzFowC6Aeac/afAGTGrBypxUHfqrKVowD" /> 

出力要求#2

<input name="__RequestVerificationToken" type="hidden" value="mOpP6LMQXnCmjr5/Wdtnhguh3PyZxWj7GWf8LYzZXPKcJBBT+DbAHvynquSD65O0DBw1RKR7DxCNg372ukftCOWms+o75CraMyFMnvjGk7RU+znIQm05eRQvr5H6d/MDyn+0DWm3jLnMBM9GplsgMRqbdAHzSe69/cS2x9A4X/9jFTZQHUWXXHUr0xewF8Rk" /> 

キーが同じ塩と同じセッションのために異なっています。 CRSFの保護について根本的な誤解がありますか?それともこれは新しい機能ですか?

答えて

5

アンチXSRFトークンは、同じランダムの値をセッションクッキーとフォームに暗号化することによって動作します。セッションCookieは、作成したフォームから投稿を作成した場合にのみ提出されます。

このアプローチは、たとえば次のようにも機能します。すべてのサーバーが暗号化キーを共有する(負荷分散のシナリオでは)サーバーファーム上で実行されます。検証は、ポストされたフォームデータの復号化された値と、公開されたセッションクッキーの復号化された値を比較することによってのみ機能します。これはdouble submitted cookieメソッドと呼ばれます。

したがって、各リクエストが異なる値を取得するのはかなり普通です。 ASP.NET MVC XSRFトークンについてThis is a nice post

+0

したがって、新しいトークンが発行されたときにサーバー上のセッションデータが変更されますか?私のクッキーの価値はすべて同じままです。 __RequestVerificationToken_Lw__のCookie値が変更されると思いました。 –

+0

いいえ、サーバーはクライアントにCookieを設定します。クライアントは、投稿時に同じ値を2回送信します。フォームデータとCookieで一度コード化されます(POST時にCookieがサーバーに転送されます)。サーバーは暗号化キーのみを認識していました。反XSRF目的のために何も格納しません。 – m0sa

+0

セッションにトークンを保存せず、クライアントにそれを送信しない理由は何ですか?何かのように:AntiForgery.GetTokens(null、cookieToken、out formToken); return cookieToken + ":" + formToken;それから、セッションにそれを保存しますか? –

関連する問題