joh*_* Gu 10 security csrf asp.net-mvc-3
我读到了如何在ASP.NET MVC Web应用程序中保护我的网站免受CSRF攻击.他们提到了两种方法,可以通过以下方式:
使用<@Html.AntiForgeryToken()>和使用令牌验证[ValidateAntiforgeryToken]
使用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验证令牌.这样,如果客户端提供它,您仍然可以使用更强大的验证令牌方法来检查引用的信息.