Я реализовал в своем приложении защиту от CSRF-атак, следуя информации, которую я прочитал в блоге в Интернете. В частности, этот пост был драйвером моей реализации
- Рекомендации для ASP.NET MVC от команды разработчиков контента для ASP.NET и веб-инструментов
- Анатомия мошенничества с межсайтовым запросом Атака из блога Фила Хаака
- AntiForgeryToken в ASP.NET MVC Framework - атрибут Html.AntiForgeryToken и ValidateAntiForgeryToken из блога Дэвида Хейдена
В основном в этих статьях и рекомендациях говорится, что для предотвращения атаки CSRF любой должен реализовать следующий код:
1) Добавьте [ValidateAntiForgeryToken]
на каждое действие, которое принимает глагол POST Http
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Добавьте <%= Html.AntiForgeryToken() %>
помощника внутри формы, которая передает данные на сервер
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
Во всяком случае, в некоторых частях моего приложения я выполняю POST Ajax с jQuery на сервере, не имея никакой формы. Это происходит, например, когда я позволяю пользователю нажимать на изображение для выполнения определенного действия.
Предположим, у меня есть таблица со списком мероприятий. У меня есть изображение в столбце таблицы с надписью «Пометить активность как выполненную», и когда пользователь нажимает на эту активность, я выполняю Ajax POST, как в следующем примере:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Как я могу использовать <%= Html.AntiForgeryToken() %>
в этих случаях? Должен ли я включить вспомогательный вызов в параметр данных вызова Ajax?
Извините за длинный пост и большое спасибо за помощь
РЕДАКТИРОВАТЬ :
Согласно jayrdub ответа я использовал следующий образ
$("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) {
// ....
}
});
});