ฉันได้ติดตั้งแอพพลิเคชั่นเพื่อลดการโจมตี CSRFจากข้อมูลที่ฉันได้อ่านในบล็อกโพสต์รอบอินเทอร์เน็ต โดยเฉพาะอย่างยิ่งโพสต์เหล่านี้เป็นตัวขับเคลื่อนของการติดตั้งของฉัน
- วิธีปฏิบัติที่ดีที่สุดสำหรับ ASP.NET MVCจากทีมเนื้อหานักพัฒนาเว็บ ASP.NET และ
- กายวิภาคของการข้ามไซต์ขอการโจมตีด้วยการปลอมแปลงจากบล็อก Phil Haack
- AntiForgeryToken ใน ASP.NET MVC Framework - Html.AntiForgeryToken และ ValidateAntiForgeryToken แอตทริบิวต์จาก David Hayden บล็อก
โดยทั่วไปบทความและคำแนะนำเหล่านั้นบอกว่าเพื่อป้องกันการโจมตี CSRF ใคร ๆ ก็ควรใช้รหัสต่อไปนี้
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 ไปยังเซิร์ฟเวอร์โดยไม่ต้องมีฟอร์มใด ๆ เลย สิ่งนี้เกิดขึ้นเช่นที่ฉันอนุญาตให้ผู้ใช้คลิกที่ภาพเพื่อดำเนินการบางอย่าง
สมมติว่าฉันมีตารางพร้อมรายการกิจกรรม ฉันมีภาพในคอลัมน์ของตารางที่ระบุว่า "ทำเครื่องหมายกิจกรรมเป็นเสร็จสมบูรณ์" และเมื่อผู้ใช้คลิกที่กิจกรรมนั้นฉันกำลังทำ 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) {
// ....
}
});
});