Eu implementei no meu aplicativo a atenuação de ataques CSRF, seguindo as informações que li em algum post de blog na Internet. Em particular, este post foi o driver da minha implementação
- Práticas recomendadas para o ASP.NET MVC da equipe de conteúdo do desenvolvedor do ASP.NET e das Ferramentas da Web
- Anatomia de um ataque de falsificação de solicitação entre sites do blog de Phil Haack
- AntiForgeryToken no ASP.NET MVC Framework - Atributo Html.AntiForgeryToken e ValidateAntiForgeryToken do blog de David Hayden
Basicamente, esses artigos e recomendações afirmam que, para impedir o ataque do CSRF, qualquer pessoa deve implementar o seguinte código:
1) Adicione o [ValidateAntiForgeryToken]
em todas as ações que aceitam o verbo POST Http
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Adicione o <%= Html.AntiForgeryToken() %>
auxiliar nos formulários que enviam dados ao servidor
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
De qualquer forma, em algumas partes do meu aplicativo, eu estou fazendo POSTs do Ajax com jQuery para o servidor sem ter nenhum formato. Isso acontece, por exemplo, em que estou permitindo que o usuário clique em uma imagem para executar uma ação específica.
Suponha que eu tenha uma tabela com uma lista de atividades. Eu tenho uma imagem em uma coluna da tabela que diz "Marcar atividade como concluída" e quando o usuário clica nessa atividade, estou executando o Ajax POST, como no exemplo a seguir:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Como posso usar o <%= Html.AntiForgeryToken() %>
nesses casos? Devo incluir a chamada auxiliar dentro do parâmetro de dados da chamada Ajax?
Desculpe pelo longo post e muito obrigado por ajudar
EDIT :
De acordo com a resposta do jayrdub , usei da seguinte maneira
$("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) {
// ....
}
});
});