Để thêm vào câu trả lời tuyệt vời osoviejo, những hướng dẫn dưới đây, từ gần đây của tôi blog post on CSRF, đặt công việc của mình cùng với các thông tin trong Blog của Phil trong một câu trả lời toàn diện.
ASP.NET/MVC cung cấp cơ chế cho việc này: bạn có thể thêm vào bộ sưu tập các bộ lọc trên đối tượng toàn cầu FilterProviders
. Điều này cho phép bạn nhắm mục tiêu một số bộ điều khiển chứ không phải cho người khác, thêm tính năng bảo mật cần thiết.
Trước tiên, chúng tôi cần triển khai IFilterProvider. Dưới đây, bạn có thể tìm thấy lớp học Conditional Filter Provider của Phil Haack. Bắt đầu bằng cách thêm lớp này vào dự án của bạn.
public class ConditionalFilterProvider : IFilterProvider
{
private readonly
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions;
public ConditionalFilterProvider(
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions)
{
_conditions = conditions;
}
public IEnumerable<Filter> GetFilters(
ControllerContext controllerContext,
ActionDescriptor actionDescriptor)
{
return from condition in _conditions
select condition(controllerContext, actionDescriptor) into filter
where filter != null
select new Filter(filter, FilterScope.Global, null);
}
}
Sau đó, thêm mã để Application_Start có thêm một mới ConditionalFilterProvider
đến việc thu thập FilterProviders toàn cầu để đảm bảo rằng tất cả các phương pháp điều khiển POST sẽ yêu cầu AntiForgeryToken.
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions =
new Func<ControllerContext, ActionDescriptor, object>[] {
// Ensure all POST actions are automatically
// decorated with the ValidateAntiForgeryTokenAttribute.
(c, a) => string.Equals(c.HttpContext.Request.HttpMethod, "POST",
StringComparison.OrdinalIgnoreCase) ?
new ValidateAntiForgeryTokenAttribute() : null
};
var provider = new ConditionalFilterProvider(conditions);
// This line adds the filter we created above
FilterProviders.Providers.Add(provider);
Nếu bạn thực hiện hai đoạn mã trên, ứng dụng MVC của bạn nên yêu cầu AntiForgeryToken cho mỗi POST cho trang web. Bạn có thể thử nó trên CSRF example web site của Phil Haack - một khi được bảo vệ, cuộc tấn công CSRF sẽ ném System.Web.Mvc.HttpAntiForgeryException
mà không cần phải thêm chú thích [ValidateAntiForgeryToken]
. Quy tắc này đưa ra một loạt các lỗ hổng liên quan đến "lập trình viên quên".
Tôi cho rằng điều này chỉ thực sự cần thiết trên các biểu mẫu cấp quyền truy cập, chẳng hạn như biểu mẫu đăng nhập hoặc biểu mẫu quản trị quyền người dùng hoặc biểu mẫu gửi thông tin nhận dạng cá nhân như số an sinh xã hội và cụm từ mật khẩu. Nhưng tôi mong được nhìn thấy câu trả lời. –
Vì CSRF có thể cho phép bất kỳ ai thực hiện bất kỳ hành động nào trên ứng dụng web theo thông tin đăng nhập của bạn, có vẻ như với tôi rằng tất cả các hành động nhập hoặc sửa đổi dữ liệu phải được bảo vệ chống lại nó. Ví dụ: thêm bản ghi vào ứng dụng kế toán. –
Họ sẽ, tất nhiên, cần thông tin đăng nhập của bạn trước tiên. :) –