W mojej aplikacji zaimplementowałem ograniczenie do ataków CSRF zgodnie z informacjami, które przeczytałem na pewnym blogu w Internecie. W szczególności te posty były motorem mojej implementacji
- Najlepsze praktyki dotyczące ASP.NET MVC od zespołu ds. Treści programistów ASP.NET i narzędzi internetowych
- Anatomia ataku typu cross-site Request Forgery Attack z bloga Phila Haacka
- AntiForgeryToken w ASP.NET MVC Framework - Html.AntiForgeryToken i ValidateAntiForgeryToken Atrybut z bloga Davida Haydena
Zasadniczo te artykuły i rekomendacje mówią, że aby zapobiec atakowi CSRF, każdy powinien wdrożyć następujący kod:
1) Dodaj [ValidateAntiForgeryToken]
na każdej akcji, która akceptuje czasownik HTTP POST
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Dodaj <%= Html.AntiForgeryToken() %>
pomocnika do formularzy, które przesyłają dane do serwera
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
W każdym razie w niektórych częściach mojej aplikacji wykonuję testy Ajax POST z jQuery na serwerze, bez żadnej formy. Dzieje się tak na przykład, gdy pozwalam użytkownikowi kliknąć obraz, aby wykonać określoną akcję.
Załóżmy, że mam tabelę z listą działań. Mam obraz w kolumnie tabeli z napisem „Oznacz aktywność jako zakończoną”, a kiedy użytkownik kliknie tę aktywność, wykonuję test POST Ajax, jak w poniższym przykładzie:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Jak mogę wykorzystać <%= Html.AntiForgeryToken() %>
w tych przypadkach? Czy powinienem dołączyć wywołanie pomocnika do parametru danych wywołania Ajax?
Przepraszamy za długi post i bardzo dziękuję za pomoc
EDYCJA :
Zgodnie z odpowiedzią jayrdub użyłem w następujący sposób
$("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) {
// ....
}
});
});