Như được chỉ ra bởi các câu trả lời khác, việc sử dụng kiểm tra liên kết giới thiệu không đủ và bạn thực sự nên sử dụng mã thông báo chống giả mạo. Tuy nhiên, như @jeffsix đã chỉ ra, bạn có thể sử dụng kiểm tra liên kết giới thiệu như một chiến lược phòng thủ (DID), vì vậy kẻ tấn công sẽ phải đánh bại nhiều, độc lập, phòng thủ để thực hiện một cuộc tấn công thành công.
Thuộc tính ValidateReferrerAttribute bên dưới có thể được sử dụng cho các hành động MVP HttpPost của bạn. Nếu liên kết giới thiệu là null, nó không có gì. Nếu liên kết giới thiệu không phải là null thì nó sẽ kiểm tra xem nó có bằng tên máy chủ được chỉ định hay không. Bạn chỉ cần thêm nó bất cứ nơi nào bạn đang sử dụng ValidateAntiForgeryTokenAttribute đã có, do đó, nó sẽ rất dễ dàng để thêm.
/// <summary>
/// For POST requests, checks that the requests referrer is the current site. This could be used along side the ValidateAntiForgeryToken
/// Note that many clients do not send the referrer, so we do nothing in this case.
/// This attribute can be used as part of a Defence-in-Depth (DID) strategy, so an
/// attacker would need to defeat multiple, independent, defenses to execute a successful attack.
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class ValidateReferrerAttribute : FilterAttribute, IAuthorizationFilter
{
/// <summary>
/// Called when authorization is required.
/// </summary>
/// <param name="filterContext">The filter context.</param>
/// <exception cref="System.ArgumentNullException">filterContext</exception>
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if ((filterContext.HttpContext.Request.UrlReferrer != null) &&
string.Equals(filterContext.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(filterContext.HttpContext.Request.UrlReferrer.Host, filterContext.HttpContext.Request.Url.Host, StringComparison.OrdinalIgnoreCase))
{
this.HandleExternalPostRequest(filterContext);
}
}
/// <summary>
/// Handles post requests that are made from an external source.
/// By default a 403 Forbidden response is returned.
/// </summary>
/// <param name="filterContext">The filter context.</param>
/// <exception cref="System.Web.HttpException">Request not allowed.</exception>
protected virtual void HandleExternalPostRequest(AuthorizationContext filterContext)
{
throw new HttpException((int)HttpStatusCode.Forbidden, "Request not allowed.");
}
}
Nguồn
2015-04-29 10:38:09
+1: Cách tiếp cận thú vị. –
nhưng đúng là cách tiếp cận mã thông báo chống giả mạo sẽ loại bỏ hầu hết các cuộc tấn công CSRFbased, nhưng nó sẽ không ngăn các bot ở đó tìm cách tự động đăng ký (và sau đó là spam) người dùng vào trang web của bạn. vì vậy làm thế nào tôi có thể chắc chắn 100% rằng trang web của tôi được bảo vệ. –
@johnG: Đó không phải là một cuộc tấn công CSRF. Để ngăn chặn spambots, những gì bạn cần là tốt [CAPTCHA] (http://en.wikipedia.org/wiki/CAPTCHA). (Trên thực tế, [bảo mật thông qua tối nghĩa] (http://en.wikipedia.org/wiki/Security_through_obscurity) có thể hoạt động khá tốt, ít nhất là đối với các trang web nhỏ: nếu bạn tạo biểu mẫu đăng nhập của mình đủ khác với các trang khác, bot sẽ không thể hiểu nó. Một người gửi spam sẽ phải dành thời gian chỉnh sửa bot của họ chỉ cho trang web của bạn, điều này không hiệu quả về chi phí cho họ trừ khi trang web của bạn thực sự lớn và phổ biến.) –