我应该使用HTTP引用者验证或令牌验证来防止CSRF攻击吗?

joh*_* Gu 10 security csrf asp.net-mvc-3

我读到了如何在ASP.NET MVC Web应用程序中保护我的网站免受CSRF攻击.他们提到了两种方法,可以通过以下方式:

  1. 使用<@Html.AntiForgeryToken()>和使用令牌验证[ValidateAntiforgeryToken]

  2. 使用HTTP引用者验证,例如:

    public class IsPostedFromThisSiteAttribute : AuthorizeAttribute
        {
        public override void OnAuthorize(AuthorizationContext filterContext)
            {
            if (filterContext.HttpContext != null)
                {
                if (filterContext.HttpContext.Request.UrlReferrer == null)
                    throw new System.Web.HttpException("Invalid submission");
                if (filterContext.HttpContext.Request.UrlReferrer.Host !=
                    "mysite.com")
                    throw new System.Web.HttpException
                        ("This form wasn't submitted from this site!");
                }
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)

    [IsPostedFromThisSite]
    public ActionResult Register(…)
    
    Run Code Online (Sandbox Code Playgroud)

所以我很困惑我是否应该使用它们来保护我的网站免受CSRF攻击,或者我是否可以选择其中一种方法?

小智 10

检查引荐来源是有问题的.首先,HTTP规范明确允许客户端不发送引用字符串(出于各种隐私原因).因此,您的一些客户可能不会包含它.其次,引用者字符串可以被欺骗,具有足够技能的攻击者可以使它们看起来像他们需要的那样以便进行成功的CSRF攻击.

使用CSRF验证令牌是一种更强大的方法,是抵御CSRF攻击的首选方法.您可以在OWASP CSRF备忘单上了解其原因.

我还要指出,你没有理由不能同时做到这两点.通常需要防御深度(DiD)策略,以便攻击者需要击败多个独立的防御来执行成功的攻击.您可以实现弱引用者检查方法(如果客户提供引用者,请确保它在执行请求之前应该是什么;如果引用者不存在,则继续进行,就像它存在并且正确一样)以及CSRF验证令牌.这样,如果客户端提供它,您仍然可以使用更强大的验证令牌方法来检查引用的信息.

  • @johnG:那不是CSRF攻击.要阻止垃圾邮件,你需要的是[CAPTCHA](http://en.wikipedia.org/wiki/CAPTCHA).(实际上,[通过默默无闻的安全](http://en.wikipedia.org/wiki/Security_through_obscurity)也可以很好地工作,至少对于小型网站来说:如果你使你的登录表格与其他人的不同,那么通用机器人将无法理解它.垃圾邮件发送者必须花时间为你的网站调整他们的机器人,这对他们来说不符合成本效益,除非你的网站真的很大并且很受欢迎.) (5认同)
  • @jeffsix我喜欢*包括*"弱"引用检查的想法.这是一个不错的额外层. (2认同)