Ho implementato nella mia app la mitigazione degli attacchi CSRF seguendo le informazioni che ho letto su alcuni post di blog su Internet. In particolare questi post sono stati il motore della mia implementazione
- Best practice per ASP.NET MVC del team di contenuti per sviluppatori ASP.NET e Web Tools
- Anatomia di un attacco di falsificazione su più siti richiesti dal blog di Phil Haack
- AntiForgeryToken in ASP.NET MVC Framework - Html.AntiForgeryToken e ValidateAntiForgeryToken Attributo dal blog di David Hayden
Fondamentalmente quegli articoli e raccomandazioni dicono che per prevenire l'attacco CSRF qualcuno dovrebbe implementare il seguente codice:
1) Aggiungi [ValidateAntiForgeryToken]
tutte le azioni che accettano il verbo POST Http
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Aggiungi l' <%= Html.AntiForgeryToken() %>
helper all'interno dei moduli che invia i dati al server
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
Comunque in alcune parti della mia app sto facendo Ajax POST con jQuery sul server senza avere alcuna forma. Questo accade ad esempio quando lascio che l'utente faccia clic su un'immagine per eseguire un'azione specifica.
Supponiamo di avere una tabella con un elenco di attività. Ho un'immagine su una colonna della tabella che dice "Segna attività come completata" e quando l'utente fa clic su quell'attività sto facendo Ajax POST come nel seguente esempio:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Come posso usare il <%= Html.AntiForgeryToken() %>
in questi casi? Devo includere la chiamata dell'helper all'interno del parametro data della chiamata Ajax?
Ci scusiamo per il lungo post e grazie mille per l'aiuto
MODIFICA :
Come da risposta jayrdub ho usato nel modo seguente
$("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) {
// ....
}
});
});