我要学ASP。净MVC 3.0(十三):MVC 3.0防止跨站点请求伪造(CSRF) * * *
众所周知,ASP。净MVC程序在浏览器运行时产生了标准的Html标签,包括浏览器要发送的关键数据等内容都在Html内容里面,听起来不错,但是假如我们仿造类似的Html内容,更改里面关键数据,在浏览器运行起来会怎么样呢?好下面我们就做这样一个例子。
<强> 强>
<强> 强>
,,,,,,
首先我们拿以前做好/编辑的人作为例子
先看控制器代码
然后我们来看看视图代码
运行起来看看
点击保存后
可以看的到,上面例子中的代码都是正确的,运行都是正常的,下面我们来实现CSRF * * *。
,,,,,,,
<强> 强>
,,,,,,,
打开记事本,写入下面代码
另存为Html文件。
双击文件运行…
允许阻止的内容之后:
啊? ? ? ~ ~ ~不会吧,此时你可能已经傻了吧……这个就叫CSRF * * *。
<强> 强>
<强> 强>
,,,,,,,
CSRF(跨站点请求伪造)中文名称:跨站请求伪造,也被称为:一键攻击/会话骑,缩写为:CSRF/XSRF。
因为在ASP。净程序中,我们的用户信息都是存在与饼干里面的,此时在用户自己来说,程序已经可以算是裸奔了。正因为如此,网络程序接受的正常客户端请求一般来自用户的点击链接和表单提交等行为。可是恶意* * *者却可以依靠脚本和浏览器的安全缺陷来劫持客户端会话,伪造客户端请求。
CSRF站内类型的漏洞在一定程度上是由于程序员滥用$ _REQUEST类变量造成的,一些敏感的操作本来是要求用户从表单提交发起帖子请求传参给程序,但是由于使用了$ _REQUEST等变量,程序也接收得到请求传参,这样就给* * *者使用CSRF * * *创造了条件,一般* * *者只要把预测好的请求参数放在站内一个贴子或者留言的图片链接里,受害者浏览了这样的页面就会被强迫发起请求。
CSRF站外类型的漏洞其实就是传统意义上的外部提交数据问题,一般程序员会考虑给一些留言评论等的表单加上水印以防止垃圾邮件问题,但是为了用户的体验性,一些操作可能没有做任何限制,所以* * *者可以先预测好请求的参数,在站外的Web页面里编写javascript脚本伪造文件请求或和自动提交的表单来实现,帖子请求,用户在会话状态下点击链接访问站外的Web页面,客户端就被强迫发起请求。
浏览器的安全缺陷
现在的网络应用程序几乎都是使用饼干来识别用户身份以及保存会话状态,但是所有的浏览器在最初加入饼干功能时并没有考虑安全因素,从Web页面产生的文件请求都会带上饼干
<强> 强>
<强> 强>
,,,,,,,,
使用AntiForgeryToken令牌,在ASP。净的核心中为我们提供了一个用来检测和组织CSRF * * *的令牌。
只要在Html表单里面使用了@Html.AntiForgeryToken()就可以阻止CSRF * * *。
相应的我们要在控制器中也要加入[ValidateAntiForgeryToken]过滤特性。
该特性表示检测服务器请求是否被篡改。
注意:该特性只能用于帖子请求,让请求无效。
,运行效果和上面的一样
然后我们在运行刚才保存的Html文件看看