/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

ASP.NET MVC 如何防御CSRF攻击(跨站请求伪造)

2015-03-18 十有三 1 浏览:1万+ .NET技术 ASP.NET MVC

本文记录了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的防御手段。

  1. 确保攻击者不能通过简单地单击 GET 请求链接来重播请求。 针对 GET 请求的 HTTP 规范意味着 GET 请求应该只用于检索,而不应该用于状态修改。
  2. 确保在攻击者已使用 JavaScript 模拟窗体 POST 请求的情况下不能重播请求。
  3. 阻止通过 GET 执行的任何操作。 例如,禁止通过 URL 创建或删除记录。 理想情况下,这些措施需要一些用户交互。 尽管这种方法不能防范更精明的、基于窗体的攻击,但它可以限制大量较容易实现的攻击,例如电子邮件图像示例中描述的攻击类型以及 XSS 遭到破坏的网站中嵌入的基本链接。

作者:十有三

出处:https://shiyousan.com/post/635623031501302495

版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。


  • 上一篇: 在windows server 2012中实现SQL SERVER EXPRESS自动备份数据库
  • 下一篇: 什么是CSRF攻击

相关文章
  • Visual Studio Community 2013 (社区版)的一些相关问答
  • ASP.NET HTTP 状态字符串无效
  • LINQ TO SQL调用dbml文件无法打开,提示未能检索当前项目.dbml 中存在验证错误而失败
  • 解决Visual Studio Community 2013中文语言包安装失败导致无法使用的问题
  • ASP.NET MVC 表单提交多层子级实体集合数据到控制器中
  • 记录下自己对网站全局设置存储方式的心得

文章分类

.NET技术 123 数据库 24 Web前端 21 网站建设运维 37 操作系统与应用 66 程序猿日常 11 开发工具 12 其他随笔 13

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 服务器 搞笑娱乐 好文分享 软件应用 生活知识 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
  • VS重构重命名的快捷键

推荐文章

  • IIS上设置ARR导致所有网站无法正常打开
  • 解决Visual Studio 起始页中"最近的项目"没有记录最近使用的项目和解决方案
  • 解决SQL Service创建链接服务器出现(null) 是无效的产品名称的问题
  • 解决SQL SERVER 2014 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或者启用了"阻止保存要求重新创建表的更改"选项
  • C#中特殊字符存入MySql报错“ERROR 1366: Incorrect string value“

友情链接

  • Passingwind的博客
  • 码友网

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号
闽公网安备 35020302035102号