Я реализовал в своем приложении защиту от 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>
В любом случае в некоторых частях моего приложения я выполняю Ajax POST с 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) {
// ....
}
});
});