2012-07-03 4 views
8

Używam metody pomocnika AntiForgeryToken. Z tego, co rozumiem na temat AntiForgeryToken, wynika, że ​​jest to baza sesji, więc każdy użytkownik ma ten sam token, ale inny użytkownik będzie miał inny token (pod warunkiem, że użyjesz tych samych soli dla wszystkich formularzy). Mój "problem" polega na tym, że AntiForgeryToken generuje różne tokeny dla tego samego użytkownika z tą samą solą. Na przykład ...Zmiany klucza AntiForgeryToken na żądanie

Contoller

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

View

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

Zapytanie Wyjście # 1

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

Wyjście Zapytanie # 2

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

Klawisze są różne dla tej samej sesji z tej samej soli. Czy mam fundamentalne niezrozumienie ochrony CRSF? A może to nowa funkcja?

Odpowiedz

5

Token anty XSRF działa poprzez zaszyfrowanie tej samej wartości losowej w pliku cookie sesji i na formularzu. Pliki cookie sesji są przesyłane tylko wtedy, gdy publikujesz post z wygenerowanego formularza.

To podejście działa również np. na farmach serwerów (w scenariuszu równoważenia obciążenia), w którym wszystkie serwery współużytkują klucz szyfrowania. Sprawdzanie poprawności działa tylko poprzez porównanie odszyfrowanej wartości z przesłanych danych formularzy i odszyfrowanej wartości z wysłanego pliku cookie sesji. Nazywa się to metodą double submitted cookie.

To normalne, że każda prośba otrzymuje inną wartość. This is a nice post o tokenach ASP.NET MVC XSRF.

+0

Czy zmienia dane sesji na serwerze po wydaniu nowego tokena? Wszystkie wartości moich plików cookie pozostają takie same. Myślałem, że wartość pliku cookie __RequestVerificationToken_Lw__ ulegnie zmianie. –

+0

Nie, serwer ustawia plik cookie na kliencie. Klient wysyła następnie tę samą wartość dwukrotnie podczas wysyłania. Po zakodowaniu w danych formularza i raz w ciasteczku (pliki cookie są przesyłane na serwer do POST). Serwer zna tylko klucz szyfrowania. Nie przechowuje niczego innego w celach anty XSRF. – m0sa

+0

Każdy powód, aby nie przechowywać po prostu tokenów w sesji i nigdy nie wysłać go do klienta? Coś jak: AntiForgery.GetTokens (null, out cookieToken, out formToken); return cookieToken + ":" + formToken; Następnie zapamiętaj to w sesji? –