Я застосував у своїй програмі пом'якшення нападів на КСВР після інформації, яку я прочитав у публікації щоденника в Інтернеті. Зокрема, ці посади були рушієм мого впровадження
- Кращі практики для ASP.NET MVC від команди вмісту розробників ASP.NET та веб-інструментів
- Анатомія крос-сайтів Запит на підробку нападу з блогу Філа Хака
- AntiForgeryToken в рамках ASP.NET MVC Framework - Html.AntiForgeryToken та ValidateAntiForgeryToken Attributes з блогу Девіда Хейдена
В основному в цих статтях та рекомендаціях написано, що для запобігання нападу на КСВР будь-хто повинен застосовувати наступний код:
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 на сервер, не маючи жодної форми. Це відбувається, наприклад, коли я дозволяю користувачеві натиснути на зображення, щоб зробити певну дію.
Припустимо, у мене є таблиця із переліком діяльності. У мене є зображення на стовпці таблиці з написом "Позначити активність як завершену", і коли користувач натискає на цю діяльність, я виконую POST Ajax як у наступному зразку:
$("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) {
// ....
}
});
});