本文记录了ASP.NET MVC预防CSRF攻击的方法,CSRF作为一种颇具威胁和恶意的攻击手段,如果不进行相应的防御措施,会造成网站在信息安全方面有极大的隐患。一旦网站用户受到跨站请求伪造攻击,恶意攻击者很有可能会对网站用户造成一定的经济损失或者窃取到用户的相关信息。
PS:CSRF(Cross-Site Request Forgery),中文翻译为跨站请求伪造。
如何防止受到CSRF攻击?
其实在ASP.NET MVC中防御CSRF攻击还是很简单的,微软在MVC框架中已经提供了令牌验证作为阻止CSRF攻击的方法。下面直接看范例:
在View视图中使用HtmlHelper.AntiForgeryToken方法生成一个隐藏的窗体字段(防伪标记),将该防伪标记放置于表单中:
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
//调用@Html.AntiForgeryToken()生成一个防伪标记
@Html.AntiForgeryToken()
<input type="text" name="text" class="form-control"/>
<input type="submit" value="提交" class="btn btn-primary"/>
}
在所请求的控制器的控制器操作上声明ValidateAntiForgeryToken特性,用于验证是否是伪造请求:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string text)
{
//此处省略代码...
return View();
}
这里就使用了ASP.NET MVC框架自带的令牌验证,使用令牌验证可以防御大多数的跨站请求伪造攻击。
这里简单的说下原理,其实就是在表单中放置一个加密的隐藏输入值(就是表单的令牌),在用户提交HTTP请求的时候,和后台对应的令牌相匹配,如果用户所提交的令牌在解密后和后台解密后的令牌值一样,那就表示此次请求不是跨站伪造的。
此外使用POST请求接收用户的数据,一定程度上可以预防由恶意的GET请求所发动的CSRF攻击,比如带有恶意图片路径的img标签。
当然也可以考虑使用HttpRequest.UrlReferrer属性,从而判断当前的请求是否是本网站还是其他恶意请求。不过由于UrlReferrer是可以伪造的,所以不要太相信使用这个属性
防范CSRF的一些实用规则
下面的资料是转载 微软MSDN的一篇文章:ASP.NET 安全 – 保护您的 ASP.NET 应用程序
在这篇链接文章中,对XSS攻击和CSRF攻击都有非常详细的说明,里面也有详细说明ASP.NET MVC的防御手段。
- 确保攻击者不能通过简单地单击 GET 请求链接来重播请求。 针对 GET 请求的 HTTP 规范意味着 GET 请求应该只用于检索,而不应该用于状态修改。
- 确保在攻击者已使用 JavaScript 模拟窗体 POST 请求的情况下不能重播请求。
- 阻止通过 GET 执行的任何操作。 例如,禁止通过 URL 创建或删除记录。 理想情况下,这些措施需要一些用户交互。 尽管这种方法不能防范更精明的、基于窗体的攻击,但它可以限制大量较容易实现的攻击,例如电子邮件图像示例中描述的攻击类型以及 XSS 遭到破坏的网站中嵌入的基本链接。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98404.html