Uygulamamda internetteki bazı blog yazılarında okuduğum bilgileri izleyerek CSRF saldırılarını hafifletmeyi uyguladım . Özellikle bu yazı benim uygulamamın itici gücü oldu
- ASP.NET ve Web Araçları Geliştirici İçerik Ekibi'nden ASP.NET MVC için En İyi Uygulamalar
- Phil Haack blogundan Siteler Arası Talep Sahteciliği Saldırısı Anatomisi
- ASP.NET MVC Çerçevesinde AntiForgeryToken - David Hayden blogundan Html.AntiForgeryToken ve ValidateAntiForgeryToken Özniteliği
Temel olarak bu makaleler ve öneriler, CSRF saldırısını önlemek için herkesin aşağıdaki kodu uygulaması gerektiğini söylüyor:
1) [ValidateAntiForgeryToken]
POST Http fiilini kabul eden her eylemi ekleyin
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) <%= Html.AntiForgeryToken() %>
Yardımcıyı sunucuya veri gönderen formların içine ekleyin
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
Neyse benim app bazı bölümlerinde hiç formu olmadan sunucuya jQuery ile Ajax POSTs yapıyorum. Bu, örneğin, kullanıcının belirli bir eylemi yapmak için bir resmi tıklatmasına izin verdiğim yerde olur.
Bir etkinlik listesi içeren bir tablom olduğunu varsayalım. "Etkinliği tamamlandı olarak işaretle" yazan tablonun bir sütununda bir görüntü var ve kullanıcı o etkinliği tıklattığında aşağıdaki örnekte olduğu gibi Ajax POST yapıyorum:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
<%= Html.AntiForgeryToken() %>
Bu durumlarda nasıl kullanabilirim ? Yardımcı çağrıyı Ajax çağrısının veri parametresinin içine dahil etmeli miyim?
Uzun yazı için özür dilerim ve yardım ettiğin için çok teşekkürler
DÜZENLE :
Gereğince jayrdub cevap aşağıdaki şekilde kullanmış
$("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) {
// ....
}
});
});