Ich habe in meiner App die Abwehr von CSRF-Angriffen implementiert, nachdem ich Informationen in einem Blogbeitrag im Internet gelesen habe. Insbesondere dieser Beitrag war der Treiber meiner Implementierung
- Best Practices für ASP.NET MVC vom ASP.NET- und Web Tools Developer Content Team
- Anatomie eines Cross-Site Request Forgery Attack von Phil Haack Blog
- AntiForgeryToken im ASP.NET MVC Framework - Html.AntiForgeryToken- und ValidateAntiForgeryToken-Attribut aus dem David Hayden-Blog
Grundsätzlich heißt es in diesen Artikeln und Empfehlungen, dass jeder den folgenden Code implementieren sollte, um den CSRF-Angriff zu verhindern:
1) Fügen Sie [ValidateAntiForgeryToken]
bei jeder Aktion, die das POST-HTTP-Verb akzeptiert, das hinzu
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Fügen Sie den <%= Html.AntiForgeryToken() %>
Helfer in Formulare ein, die Daten an den Server senden
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
Wie auch immer, in einigen Teilen meiner App mache ich Ajax-POSTs mit jQuery auf dem Server, ohne überhaupt ein Formular zu haben. Dies geschieht zum Beispiel, wenn ich den Benutzer auf ein Bild klicken lasse, um eine bestimmte Aktion auszuführen.
Angenommen, ich habe eine Tabelle mit einer Liste von Aktivitäten. Ich habe ein Bild in einer Spalte der Tabelle mit der Aufschrift "Aktivität als abgeschlossen markieren". Wenn der Benutzer auf diese Aktivität klickt, führe ich den Ajax-POST wie im folgenden Beispiel aus:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Wie kann ich das <%= Html.AntiForgeryToken() %>
in diesen Fällen verwenden? Sollte ich den Hilfsaufruf in den Datenparameter des Ajax-Aufrufs aufnehmen?
Entschuldigung für den langen Beitrag und vielen Dank für Ihre Hilfe
EDIT :
Wie pro jayrdub Antwort habe ich in der folgenden Art und Weise verwendet ,
$("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) {
// ....
}
});
});