Saya telah menerapkan mitigasi serangan CSRF di aplikasi saya mengikuti informasi yang saya baca di beberapa posting blog di internet. Khususnya posting ini telah menjadi pendorong implementasi saya
- Praktik Terbaik untuk ASP.NET MVC dari Tim Konten Pengembang ASP.NET dan Alat Web
- Anatomi Permintaan Lintas Situs Memalsukan Serangan dari blog Phil Haack
- AntiForgeryToken dalam ASP.NET MVC Framework - Html.AntiForgeryToken dan ValidasikanAntiForgeryToken Atribut dari blog David Hayden
Pada dasarnya artikel dan rekomendasi tersebut mengatakan bahwa untuk mencegah serangan CSRF, siapa pun harus menerapkan kode berikut:
1) Tambahkan [ValidateAntiForgeryToken]
pada setiap tindakan yang menerima kata kerja POST Http
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Tambahkan <%= Html.AntiForgeryToken() %>
helper form dalam yang mengirimkan data ke server
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
Ngomong-ngomong di beberapa bagian aplikasi saya, saya melakukan POS Ajax dengan jQuery ke server tanpa memiliki bentuk apa pun. Ini terjadi misalnya ketika saya membiarkan pengguna mengklik gambar untuk melakukan tindakan tertentu.
Misalkan saya punya meja dengan daftar kegiatan. Saya memiliki gambar di kolom tabel yang mengatakan "Tandai aktivitas selesai" dan ketika pengguna mengklik aktivitas tersebut saya melakukan POST Ajax seperti dalam contoh berikut:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Bagaimana saya bisa menggunakan <%= Html.AntiForgeryToken() %>
ini dalam kasus ini? Haruskah saya menyertakan panggilan pembantu di dalam parameter data panggilan Ajax?
Maaf untuk posting lama dan terima kasih banyak telah membantu
EDIT :
Sesuai jawaban jayrdub saya telah menggunakan cara berikut
$("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) {
// ....
}
});
});