我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

2024-05-07 19:20:25

我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击

概述

    

众所周知,ASP.Net MVC程序在浏览器运行时产生了标准的Html标签,包括浏览器要发送的关键数据等内容都在Html内容里面,听起来不错,但是假如我们仿造类似的Html内容,更改里面关键数据,在浏览器运行起来会怎么样呢?好下面我们就做这样一个例子。

CSRF攻击例子

首先我们拿以前做好的person/edit作为例子

先看控制器代码

    //初始页面//GET: /Person/Edit/5publicActionResult Edit(intid){returnView();}//修改方法//POST: /Person/Edit/5[HttpPost]publicActionResult Edit(intid, Person person){try{//数据库操作代码returnRedirectToAction("Success",person);}catch{returnView();}}

  

然后我们来看看视图代码

@model MvcApplication.Models.Person
@{ViewBag.Title = "修改人员";Layout = "~/Views/Shared/_Layout.cshtml";
}<h2>修改人员</h2><scriptsrc="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script><scriptsrc="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>@using (Html.BeginForm())
{@Html.ValidationSummary(true)<fieldset><legend>人员信息</legend>@Html.HiddenFor(model => model.ID)<divclass="editor-label">@Html.LabelFor(model => model.Name)</div><divclass="editor-field">@Html.EditorFor(model => model.Name)@Html.ValidationMessageFor(model => model.Name)</div><divclass="editor-label">@Html.LabelFor(model => model.Age)</div><divclass="editor-field">@Html.EditorFor(model => model.Age)@Html.ValidationMessageFor(model => model.Age)</div><p><inputtype="submit"value="保存"/></p></fieldset>}<div>@Html.ActionLink("返回列表", "Index")</div>

  

运行起来看看

点击保存后

可以看到,上面例子中的代码都是正确的,运行都是正常的,下面我们来实现CSRF攻击。

实现CSRF攻击

打开记事本,写入下面代码

<bodyonload="document.getElementById('fm1').submit()"><formid="fm1"action="http://localhost:5132/person/Edit/1001"method="post"><inputname="name"value="张三"/><inputname="age"value="21"/></form></body>

  

另存为Html文件。

双击文件运行。。。

允许阻止的内容之后:

啊???~~~不会吧,此时你可能已经傻了吧。。。这个就叫CSRF攻击。

什么是CSRF攻击

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

因为在ASP.NET程序中,我们的用户信息都是存在与cookies里面的,此时在用户自己来说,程序已经可以算是裸奔了。正因为如此,Web程序接受的正常客户端请求一般来自用户的点击链接和表单提交等行为。可是恶意攻击者却可以依靠脚本和浏览器的安全缺陷来劫持客户端会话、伪造客户端请求。攻击者盗用了你的身份,以你的名义发送恶意请求,以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。这就是CSRF攻击。

CSRF漏洞的攻击一般分为站内和站外两种类型:

CSRF站内类型的漏洞在一定程度上是由于程序员滥用$_REQUEST类变量造成的,一些敏感的操作本来是要求用户从表单提交发起POST请求传参给程序,但是由于使用了$_REQUEST等变量,程序也接收GET请求传参,这样就给攻击者使用CSRF攻击创造了条件,一般攻击者只要把预测好的请求参数放在站内一个贴子或者留言的图片链接里,受害者浏览了这样的页面就会被强迫发起请求。

CSRF站外类型的漏洞其实就是传统意义上的外部提交数据问题,一般程序员会考虑给一些留言评论等的表单加上水印以防止SPAM问题,但是为了用户的体验性,一些操作可能没有做任何限制,所以攻击者可以先预测好请求的参数,在站外的Web页面里编写javascript脚本伪造文件请求或和自动提交的表单来实现GET、POST请求,用户在会话状态下点击链接访问站外的Web页面,客户端就被强迫发起请求。

浏览器的安全缺陷

现在的Web应用程序几乎都是使用Cookie来识别用户身份以及保存会话状态,但是所有的浏览器在最初加入Cookie功能时并没有考虑安全因素,从WEB页面产生的文件请求都会带上COOKIE

MVC中防止CSRF攻击

使用AntiForgeryToken令牌,在ASP.NET的核心中为我们提供了一个用来检测和组织CSRF攻击的令牌。

只要在Html表单里面使用了@Html.AntiForgeryToken()就可以阻止CSRF攻击。

@model MvcApplication.Models.Person
@{ViewBag.Title = "修改人员";Layout = "~/Views/Shared/_Layout.cshtml";
}<h2>修改人员</h2><scriptsrc="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script><scriptsrc="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>@using (Html.BeginForm())
{@Html.AntiForgeryToken()@Html.ValidationSummary(true)<fieldset><legend>人员信息</legend>@Html.HiddenFor(model => model.ID)<divclass="editor-label">@Html.LabelFor(model => model.Name)</div><divclass="editor-field">@Html.EditorFor(model => model.Name)@Html.ValidationMessageFor(model => model.Name)</div><divclass="editor-label">@Html.LabelFor(model => model.Age)</div><divclass="editor-field">@Html.EditorFor(model => model.Age)@Html.ValidationMessageFor(model => model.Age)</div><p><inputtype="submit"value="保存"/></p></fieldset>}<div>@Html.ActionLink("返回列表", "Index")</div>

  

相应的我们要在Controller中也要加入[ValidateAntiForgeryToken]过滤特性。

该特性表示检测服务器请求是否被篡改。

注意:该特性只能用于post请求,get请求无效。

//修改方法//POST: /Person/Edit/5[ValidateAntiForgeryToken][HttpPost]publicActionResult Edit(intid, Person person){try{//数据库操作代码returnRedirectToAction("Success",person);}catch{returnView();}}

  

运行效果和上面的一样

然后我们在运行刚才保存的Html文件看看

哈哈报错了。。那就证明我们现在的阻止CSRF攻击是有效的。

使用Salt值加强保护

为了保证我们的AntiForgeryToken阻止在程序中唯一,更好的加密AntiForgeryToken,我们可以为AntiForgeryToken设置Salt值。

这样,即使攻击者设法得到了令牌,但是如果Salt值不匹配也不能进行post操作。

//修改方法//POST: /Person/Edit/5[ValidateAntiForgeryToken(Salt="aa")][HttpPost]publicActionResult Edit(intid, Person person){try{//数据库操作代码returnRedirectToAction("Success",person);}catch{returnView();}}

  

我们暂时不修改View代码

运行看看

可以看到加入Salt值后即使是MVC程序本身的页面都无法请求,更别说攻击者了,除非他能猜到我们的Salt值。

我们修改view代码

    @Html.AntiForgeryToken("aa")

  

继续运行项目

可以看到在view中加入Salt值后,阻止就变的有目的性了。

      

总结

浏览器的会话安全特性 :

我们参照Set-Cookie的标准格式

Set-Cookie: <name>=<value>[; <name>=<value>] [; expires=<date>][; domain=<domain_name>] [; path=<some_path>][; secure][; HttpOnly]

浏览器支持的cookie实际上分为两种形式:

一种是内存COOKIE,在没有设定COOKIE值的expires参数,也就是没有设置COOKIE的失效时间情况下,这个COOKIE在关闭浏览器后将失效,并且不会保存在本地。另外一种是本地保存COOKIE,也就是设置了expires参数,COOKIE的值指定了失效时间,那么这个COOKIE会保存在本地,关闭浏览器后再访问网站,在COOKIE有效时间内所有的请求都会带上这个本地保存COOKIE。

Internet Explorer有一个隐私报告功能,其实这是一个安全功能,它会阻挡所有的第三方COOKIE,比如A域Web页面嵌入了B域的文件,客户端浏览器访问了A域的Web页面后对B域所发起的文件请求所带上的COOKIE会被IE拦截。除开文件请求情况,A域的Web页面如果使用IFRAME帧包含B域的Web页面,访问A域的Web页面后,B域的Web页面里的所有请求包括文件请求带上的COOKIE同样会被IE拦截。不过Internet Explorer的这个安全功能有两个特性,一是不会拦截内存COOKIE,二是在网站设置了P3P头的情况下,会允许跨域访问COOKIE,隐私报告功能就不会起作用了。

所以在Internet Explorer的这个安全特性的前提下,攻击者要进行站外的CSRF攻击使用文件请求来伪造GET请求的话,受害者必须在使用内存COOKIE也就是没有保存登陆的会话状态下才可能成功。而Firefox浏览器并没有考虑使用这样的功能,站外的CSRF攻击完全没有限制。

关于Javascript劫持技术 :

近年来的web程序频繁使用Ajax技术,JSON也开始取代XML做为AJAX的数据传输格式,JSON实际上就是一段javascript,大部分都是定义的数组格式。fortify公司的三位安全人员在2007年提出了Javascript劫持技术,这是一种针对JSON动态数据的攻击方式,实际上这也是一种变相的CSRF攻击。攻击者从站外调用一个script标签包含站内的一个JSON动态数据接口,因为<script src=”>这种脚本标签的文件请求会带上COOKIE,用户访问后相当于被迫从站外发起了一个带有身份认证COOKIE的GET请求,web程序马上返回了用户相关的JSON数据,攻击者就可以取得这些关键的JSON数据加以利用,整个过程相当于一个站外类型的CSRF攻击。

WEB应用中的JSON数据大部分使用在个人资料、好友列表等隐私功能里,这类数据一般是web蠕虫最重要的传播功能所需要的数据,而CSRF攻击结合Javascript劫持技术完全可以分析这类数据制作自动传播的web蠕虫,在一定情况下这种web蠕虫比网站出现跨站脚本漏洞制作的web蠕虫更具威胁性,几乎不受网站架构的限制,因为攻击者利用的不是传统的Web漏洞而是网站自身正常的功能,如果出现这类CSRF蠕虫,对网站的打击将是灾难性的。

安全提醒 :

各个大型社区类网站必须警惕CSRF攻击和相关web蠕虫的爆发,并且针对这类web攻击制定有效的应急措施。同建议程序员不要滥用$_REQUEST类变量,在必要的情况下给某些敏感的操作加上水印,考虑使用类似DISCUZ论坛的formhash技术提高黑客预测请求参数的难度,注意JSON数据接口的安全问题等。最后希望大家全面的考虑客户端和服务端整体的安全,注意Internet Explorer等客户端浏览器一些安全缺陷和安全特性,防止客户端程序的安全问题影响整个Web应用程序。

本文转自程序猿博客51CTO博客,原文链接http://blog.51cto.com/haihuiwei/1966358如需转载请自行联系原作者

365850153

我要学ASP.NET MVC 3.0(十三): MVC 3.0 防止跨站点请求伪造 (CSRF) 攻击相关推荐

  1. MVC安全:ajax表单提交切记加上AntiForgeryToken防止跨站请求伪造 (CSRF)攻击

    因为项目使用的是mvc的框架,前端使用的是metronic bootstrap框架,所以在处理表单的提交时就用了ajax的方式进行提交,这样前端js也方便封装,实现代码复用. 先看看js端的相关代码 ...

  2. ASP.NET Core 防止跨站请求伪造(XSRF\/CSRF)攻击

    什么是反伪造攻击? 跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互.这种攻击是完全有可能的 ...

  3. 在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击

    什么是跨站请求伪造 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或 ...

  4. php 设置跨域axios,vue2.0中proxyTable用axios进行跨域请求的设置方法

    vue2.0设置proxyTable使用axios进行跨域请求的方法 这里请求的是知乎日报的api,由@izzyleung这位大神提供的,这是github地址. 在vue-cli构建的项目中先安装ax ...

  5. 使用ASP.NET Core、JavaScript和Angular防止CSRF攻击

    目录 介绍 关于源代码 CSRF示例 攻击剖析 保护您的Web应用程序 CSRF攻击实战 防伪令牌 ASP.NET Core中的防伪 令牌生成:手动方式 令牌生成:自动方式 令牌验证 JavaScri ...

  6. MVC Html.AntiForgeryToken() 防止CSRF攻击

    (一)MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site requ ...

  7. 保护ASP.NET 应用免受 CSRF 攻击

    CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...

  8. MVC防止CSRF攻击

    可能我们大多数人做web的时候不会太注意这个问题,但是这是一个很重要的一个点.我们写代码写业务的时候也应该从各方面多思考. 首先就是先简单介绍下什么是CSRF CSRF 全程是 Cross-site ...

  9. ASP.NET Core launchsettings.json文件(8)《从零开始学ASP.NET CORE MVC》:

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core 进程外(out-of-process)托管 ASP.NET Core launchsetting ...

最新文章

  1. LabVIEW设计自定义滚动条
  2. BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)
  3. mysql 查看某个表缓存情况_MySQL 查询缓存 QUERY_CACHE
  4. Learning to Rank 中Listwise关于ListNet算法讲授及实现
  5. formal method online checking tool
  6. unity 半透明混合问题_Unity Shader 透明度混合的双面渲染(十八)
  7. FastDFS安装与部署
  8. 轻量级3d模型查看器_你该试试这样来管理你的3D资产了 Connecter
  9. 《王朔和海岩的文学选择》
  10. java文件读写详细介绍_java文件读写操作大全
  11. oracle的table是什么,oracle – 什么是XMLTABLE
  12. Google+强推实名制引爆不满 用户增速放缓
  13. Docker 的使用
  14. 团队计划(4.22)
  15. python项目方案书-前端python解释器方案预研
  16. NLP任务增强:通过引入外部知识库来提供额外信息
  17. 使用openssl 来生成rsa pkcs1 2048格式的公私钥
  18. 网站刷IP?活不过三秒
  19. 【渝粤题库】国家开放大学2021春1089现代教育思想题目
  20. codeforces 69A. Young Physicist

热门文章

  1. 深度学习这么调参训练_聊一聊深度学习中的调参技巧?
  2. 怎么查看表用了那个序列_3套阴瑜伽序列,让你身心平衡
  3. 250分b区计算机专硕,2021兰州大学研究生复试分数线
  4. ajax 制作表格带查询参数,查询表格——建立动态表格,使用ajax输入查询条件将后台数据查询出来以表格的形式展示出来...
  5. Android开源aria使用,1.1 开始
  6. 你了解node多进程吗
  7. 计算机专业教研成绩,2018学年第一学期计算机组教研组工作计划
  8. 20201023:力扣第37场双周赛(上)
  9. jfinal html页面在多个路径,jfinal不能正确加载html网页,总是报错的解决方法
  10. yoyo跑_足球YOYO体测大揭秘 失去资格只需两次