Tôi đã thực hiện trong ứng dụng của mình việc giảm thiểu các cuộc tấn công CSRF sau các thông tin mà tôi đã đọc trên một số bài đăng trên blog trên internet. Đặc biệt những bài đăng này đã là động lực thực hiện của tôi
- Thực tiễn tốt nhất cho ASP.NET MVC từ Nhóm nội dung nhà phát triển công cụ web và ASP.NET
- Cấu tạo của một cuộc tấn công giả mạo yêu cầu chéo từ blog Phil Haack
- AntiForgeryToken trong ASP.NET MVC Framework - Html.AntiForgeryToken và ValidateAntiForgeryToken Thuộc tính từ blog David Hayden
Về cơ bản những bài viết và khuyến nghị nói rằng để ngăn chặn cuộc tấn công CSRF, bất kỳ ai cũng nên thực hiện mã sau đây:
1) Thêm [ValidateAntiForgeryToken]
vào mọi hành động chấp nhận động từ POST http
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
2) Thêm trình <%= Html.AntiForgeryToken() %>
trợ giúp bên trong các biểu mẫu gửi dữ liệu đến máy chủ
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
Dù sao, trong một số phần của ứng dụng của tôi, tôi đang thực hiện POST POST với jQuery cho máy chủ mà không có bất kỳ hình thức nào cả. Điều này xảy ra ví dụ khi tôi cho phép người dùng nhấp vào hình ảnh để thực hiện một hành động cụ thể.
Giả sử tôi có một bảng với một danh sách các hoạt động. Tôi có một hình ảnh trên một cột của bảng có nội dung "Đánh dấu hoạt động là đã hoàn thành" và khi người dùng nhấp vào hoạt động đó, tôi đang thực hiện POST POST như trong mẫu sau:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Làm thế nào tôi có thể sử dụng <%= Html.AntiForgeryToken() %>
trong những trường hợp này? Tôi có nên bao gồm cuộc gọi của người trợ giúp bên trong tham số dữ liệu của cuộc gọi Ajax không?
Xin lỗi vì bài viết dài và cảm ơn rất nhiều vì đã giúp đỡ
CHỈNH SỬA :
Theo câu trả lời của jayrdub, tôi đã sử dụng theo cách sau
$("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) {
// ....
}
});
});