Я применил в своем приложении смягчение атак CSRF в соответствии с информацией, которую я прочитал в блоге в Интернете. В частности, эти сообщения были драйвером моей реализации
- Рекомендации для ASP.NET MVC из группы контента для разработчиков ASP.NET и веб-инструментов.
- Анатомия межсайтового запроса на подделку из блога Phil Haack
- AntiForgeryToken в ASP.NET MVC Framework - Html.AntiForgeryToken и ValidateAntiForgeryToken Атрибут из блога Дэвида Хейдена
В основном эти статьи и рекомендации говорят, что для предотвращения атаки CSRF кто-то должен реализовать следующий код:
1) Добавьте [ValidateAntiForgeryToken]
для каждого действия, принимающего HTTP-адрес POST
[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) {
// ....
}
});
});