ASP.NET MVC3 AntiForgeryToken
Ici, j'ai simple MVC3 application avec deux postes. Pour protéger attaque CSRF, j'ai utilisé antiforgerytoken html helpers dans les deux formes comme par des conseils ici.
Voici mes deux modèles:
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
Voici mon contrôleur homeController.cs:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(User user)
{
if (ModelState.IsValid)
return RedirectToAction("About");
return View();
}
public ActionResult About()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult About(Employee employee)
{
if (ModelState.IsValid)
return RedirectToAction("PageA");
return View();
}
}
Voici mon Inex.cshtml:
@model MvcAntiforgeryToken.Models.User
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
<div>
<fieldset>
<legend>User Information</legend>
<div class="editor-label">
@Html.LabelFor(m => m.FirstName)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.LastName)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.LastName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
</div>
}
Voici mon Sujet.cshtml:
@model MvcAntiforgeryToken.Models.Employee
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
<div>
<fieldset>
<legend>Employee Information</legend>
<div class="editor-label">
@Html.LabelFor(m => m.Id)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.Id)
@Html.ValidationMessageFor(m => m.Id)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.Name)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
</div>
}
L'affichage de la Maison/de l'Indice:
lorsque l'utilisateur visite à Domicile/Index, une application créée à l' "RequestVerificationToken_Lw" cookie avec la valeur "pG2/E00Q2DngYxs98f92x9qqrIvrh6zCT/+GGte67NFZLazKFlz++QqMSHpkZ08Qum9vsBCtq7O7MSzCawJkEa2/hdjrWoAcHlDWxxYRWKXm+OxPbqlRs609zam4fK7hReGEX3zf8YR4lth3oyf4azgt2mzv31ihrgshiz7oy9k="
et masqué suivant formulaire d'entrée
<input name="__RequestVerificationToken" type="hidden" value="B1KKzYEFEdINnuhy53MqqxHCHELPUd5pX3vRqYWz1+pkhBA6YGFvSVtXgSURkAn3yNwee3nrqDCMXB8MB0SWiUU3GuHnhH7+Qc1IQebJHoFJZR2CPXNOmUzINXbBWKZz+35pQQQXdiKptR3raLSoElfQi18ZC4Pr7xNREGIOM2A=" />
L'affichage de la Maison/à Propos de:
lorsque l'utilisateur visite à Domicile/Sur, une application créée à l' "RequestVerificationToken_Lw" cookie avec la valeur "pG2/E00Q2DngYxs98f92x9qqrIvrh6zCT/+GGte67NFZLazKFlz++QqMSHpkZ08Qum9vsBCtq7O7MSzCawJkEa2/hdjrWoAcHlDWxxYRWKXm+OxPbqlRs609zam4fK7hReGEX3zf8YR4lth3oyf4azgt2mzv31ihrgshiz7oy9k="
et la forme suivante entrée
<input name="__RequestVerificationToken" type="hidden" value="UOCMATdy93A0230aBmRPv5F0xpJlI2urE5sJ4nxsTSWrsi9/xM5qhrxQ4I2vWIjvVrhkW8gSgmGFp7c4XPQUQG5myMGipTAr2/mi5od+Sz6IcfrF2FxwjfWMslt96BcMG6b9BjaGbgnClQOVTkjfHEMIptOYUCTSbVK61dWp5qI=" />
Voici mes questions:
- pourquoi "RequestVerificationToken_Lw" cookie valeur est la même dans les deux formes? shoudn-il pas être recréé pour tous les types de postes?
- pourquoi "RequestVerificationToken_Lw" valeur du cookie et "__RequestVerificationToken" caché les valeurs d'entrée sont différentes ?
Merci beaucoup pour vos réponses!
OriginalL'auteur matmat | 2013-01-20
Vous devez vous connecter pour publier un commentaire.
L'idée de l'attaque CSRF vecteur est ceci: j'ai mis en place une forme malveillante sur mon site https://fake-domain-that-looks-like-a-bank.com. J'ai pris le code HTML et CSS de votre site, de sorte qu'il ressemble exactement la même. Je valide cert et tous le logo de cloches et de sifflets. Maintenant, je tromper les utilisateurs en visitant mon site.
L'utilisateur voit la forme habituelle et fait quelque chose. Cependant, j'ai remplacé certaines entrées de sorte qu'ils ne mènent nulle part, et j'ai ajouté quelques champs cachés, donc je contrôle ce que fait l'utilisateur (involontairement), à l'instar de remplacer
'op=modify
avecop=delete
. Toutes ses actions sont soutenues par son (valide) auth cookie.Maintenant les anti faux jeton protège l'utilisateur car, en tant qu'attaquant, je ne peux pas ajouter valide d'un champ caché qui correspond à son témoin de ma forme. Si je pouvais lire son des cookies en quelque sorte, je ne pouvais tout simplement voler le jeton d'authentification qui sera beaucoup plus facile.
MVC, la lutte contre le faux jeton est lié à l'utilisateur connecté. Si vous utilisez
FormsAuthentication
et de changer la structure des noms d'utilisateurs, tous les utilisateurs existants de cookies en difficulté. Comme une note de côté: un problème commun est que les utilisateurs qui possèdent deux comptes de fonctionner enAntiForgeryTokenExceptions
, vous souhaitez peut-être gérer que si il est valide d'un scénario d'utilisation.Pour répondre aux questions:
Pourquoi le cookie ne pas changer
Si la valeur du cookie changé avec chaque demande, la navigation multi-onglet serait un problème.
Pourquoi cookie et la forme de la valeur différente
MVC est les cookies ont une structure interne, de sorte que leur sérialisé version a l'air différent. Le jeton de sécurité réel qui est à l'intérieur doivent être identiques. Le sérialiseur stocke des informations différentes, selon que l'information est présente (identité de l'utilisateur de nom, etc.). Il existe également une version de l'octet, un indicateur de savoir si c'est un cookie de session, etc.
Détails
Si vous voulez en savoir plus, je vous recommande de cloner la source via http://aspnetwebstack.codeplex.com/ et de regarder
System.Web.WebPages\Helpers\AntiXsrf\TokenValidator.cs
, parmi d'autres fichiers. Il est très utile d'avoir la source de autour de en tout cas.OriginalL'auteur mnemosyn
Je n'ai pas d'idée précise, mais je pense qu'il devrait être une valeur pour "RequestVerificationToken_Lw" qui va voyager à travers pour une seule session. Il ne sera pas de créer de nouvelles valeurs pour chaque forme.
OriginalL'auteur Dilip