He implementado en mi aplicación la mitigación de los ataques CSRF siguiendo las informaciones que he leído en alguna publicación de blog en Internet. En particular, estas publicaciones han sido el motor de mi implementación
- Mejores prácticas para ASP.NET MVC del equipo de contenido de desarrolladores de herramientas web y ASP.NET
- Anatomía de un ataque de falsificación de solicitud de sitios cruzados del blog de Phil Haack
- AntiForgeryToken en el Framework ASP.NET MVC - Html.AntiForgeryToken y ValidateAntiForgeryToken Attribute del blog de David Hayden
Básicamente, esos artículos y recomendaciones dicen que para evitar el ataque CSRF cualquiera debería implementar el siguiente código:
1) Agregue el [ValidateAntiForgeryToken]
en cada acción que acepte el verbo Http POST
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Agregue el <%= Html.AntiForgeryToken() %>
ayudante dentro de los formularios que envían datos al servidor
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
De todos modos, en algunas partes de mi aplicación, estoy haciendo Ajax POST con jQuery al servidor sin tener ningún formulario. Esto sucede, por ejemplo, cuando dejo que el usuario haga clic en una imagen para realizar una acción específica.
Supongamos que tengo una tabla con una lista de actividades. Tengo una imagen en una columna de la tabla que dice "Marcar actividad como completada" y cuando el usuario hace clic en esa actividad, estoy haciendo la POST de Ajax como en la siguiente muestra:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
¿Cómo puedo usar el <%= Html.AntiForgeryToken() %>
en estos casos? ¿Debo incluir la llamada de ayuda dentro del parámetro de datos de la llamada Ajax?
Perdón por la larga publicación y muchas gracias por ayudar
EDITAR :
Según la respuesta de jayrdub , he usado de la siguiente manera
$("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) {
// ....
}
});
});