跨站请求伪造(Cross-Site Request Forgery,CSRF,但也用缩写XSRF表示),CSRF比简单的跨站脚本攻击更具危险性。
阻止CSRF攻击
1)、令牌验证
可采用ASP.NET MVC 框架自带的方法:
<form action="/account/register" method="post">
@Html.AntiForgeryToken()
...
</form>
Html.AntiForgeryToken辅助方法会输出一个加密值作为隐藏的输入元素:
<input type="hidden" value="012837udby32098jhjhjhdj">
隐藏值作为cookie存于浏览器,会话时进行验证
[ValidateAntiforgeryToken]
public ActionResult Register(...)
2)、幂等的GET请求
一般仅通过POST请求修改数据库或网站上的内容,就可以有效防止全部CSRF攻击。
3)、HttpRefferer验证
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!");
}
}
}
}
//在Register方法上添加过滤器
[IsPostedFromThisSite]
public ActionResult Register(...)