J'ai mis en œuvre dans mon application l'atténuation des attaques CSRF suite aux informations que j'ai lues sur certains articles de blog sur Internet. En particulier, ces postes ont été le moteur de ma mise en œuvre
- Meilleures pratiques pour ASP.NET MVC de l'équipe de contenu pour les développeurs ASP.NET et Web Tools
- Anatomie d'une attaque de contrefaçon de demande intersite de intersite sur le blog de Phil Haack
- AntiForgeryToken dans le cadre ASP.NET MVC - Html.AntiForgeryToken et ValidateAntiForgeryToken Attribute from David Hayden blog
Fondamentalement, ces articles et recommandations indiquent que pour empêcher l'attaque CSRF, quiconque devrait implémenter le code suivant:
1) Ajoutez le [ValidateAntiForgeryToken]
sur chaque action qui accepte le verbe Http POST
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Ajoutez l' <%= Html.AntiForgeryToken() %>
assistant à l'intérieur des formulaires qui soumet des données au serveur
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
Quoi qu'il en soit, dans certaines parties de mon application, je fais des POST Ajax avec jQuery sur le serveur sans aucune forme. Cela se produit par exemple lorsque je laisse l'utilisateur cliquer sur une image pour effectuer une action spécifique.
Supposons que j'ai une table avec une liste d'activités. J'ai une image sur une colonne du tableau qui dit "Marquer l'activité comme terminée" et lorsque l'utilisateur clique sur cette activité, je fais le POST Ajax comme dans l'exemple suivant:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Comment puis-je utiliser le <%= Html.AntiForgeryToken() %>
dans ces cas? Dois-je inclure l'appel d'aide dans le paramètre de données de l'appel Ajax?
Désolé pour le long post et merci beaucoup pour votre aide
MODIFIER :
Selon la réponse de jayrdub, j'ai utilisé de la manière suivante
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {
AddAntiForgeryToken({}),
id: parseInt($(this).attr("title"))
},
success: function (response) {
// ....
}
});
});