您好,欢迎访问一九零五行业门户网

MVC Html.AntiForgeryToken() 防止CSRF攻击_html/css_WEB-ITnose

mvc中的html.antiforgerytoken()是用来防止跨站请求伪造(csrf:cross-site request forgery)攻击的一个措施,它跟xss(xss又叫css:cross-site-script),攻击不同,xss一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,而csrf则是伪造成受信任用户对网站进行攻击。
举个简单例子,譬如整个系统的公告在网站首页显示,而这个公告是从后台提交的,我用最简单的写法:
网站后台(home/index页面)设置首页公告内容,提交到homecontroller的text action
[html]  view plain  copy
@using (html.beginform(text,home,formmethod.post))   {       @:网站公告:          }    
homecontroller的text action
[csharp]  view plain  copy
[httppost]    public actionresult text()    {        viewbag.notice = request.form[notice].tostring();        return view();    }  
填写完公告,提交,显示
此时提供给了跨站攻击的漏洞,csrf一般依赖几个条件
(1)攻击者了解受害者所在的站点
(2)攻击者的目标站点具有持久化授权cookie或者受害者具有当前会话cookie
(3)目标站点没有对用户在网站行为的第二授权此时
具体参见http://baike.baidu.com/view/1609487.htm
现假设我知道我要攻击的网站的地址,譬如是http://localhost:6060/home/text,且也满足2,3的情况。
于是我新建一个antiforgerytext.html文件,内容如下:
[html]  view plain  copy
nbsp;html public -//w3c//dtd xhtml 1.0 transitional//en http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd>                                                                 
在这个html中加了一个隐藏的字段,name和id和网站要接收的参数名一样。
我点击了“黑掉这个网站”,呈现如下
这个就是利用了漏洞把首页的公告给改了,这就是一个简单的跨站攻击的例子。
mvc中通过在页面上使用 html.antiforgerytoken()配合在对应的action上增加[validateantiforgerytoken]特性来防止跨站攻击。
把上面的代码改成
[html]  view plain  copy
@using (html.beginform(text,home,formmethod.post))   {       @html.antiforgerytoken()       @:网站公告:      }  
对应的action
[csharp]  view plain  copy
[httppost]   [validateantiforgerytoken]   public actionresult text()   {       viewbag.notice = request.form[notice].tostring();       return view();   }    
这样子我在antiforgerytext.html中点黑掉这个网站,就会出现
这样就防止了跨站攻击。
页面上的html.antiforgerytoken()会给访问者一个默认名为__requestverificationtoken的cookie
为了验证一个来自form post,还需要在目标action上增加[validateantiforgerytoken]特性,它是一个验证过滤器,
它主要检查
(1)请求的是否包含一个约定的antiforgery名的cookie
(2)请求是否有一个request.form[约定的antiforgery名],约定的antiforgery名的cookie和request.form值是否匹配
其中主要涉及到system.web.webpages.dll中的静态类antiforgery
html.antiforgerytoken()调用了antiforgery静态类的gethtml方法,它产生一个随机值然后分别存储到客户端cookie和页面的hidden field中,
(1)request.cookies[antiforgerytokenname](默认也是request.cookies[__requestverificationtoken])
(2)页面上的hiddenfield
[html]  view plain  copy
其中cookie的key的名字和页面hidden field的名字是一样的,默认都是__requestverificationtoken,如果有提供applicationpath的话,那就是由__requestverificationtoken和经过处理后的applicationpath组成。
controller端则通过在action上增加[validateantiforgerytoken]特性来验证,
validateantiforgerytokenattribute继承了filterattribute和iauthorizationfilter,通过传递匿名委托方法,
委托调用antiforgery类的validate方法来实现验证。
validate方法中主要验证request.cookies[antiforgerytokenname]和两个的值是否相同,
如果页面没有,或者两个值不相等,就会抛出异常。
(二)关于csrf攻击及mvc中的解决方案 [validateantiforgerytoken]
一.csrf是什么?
csrf(cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:csrf/xsrf。
二.csrf可以做什么?
你这可以这么理解csrf攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。csrf能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
三.csrf漏洞现状
csrf这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出csrf漏洞,如:nytimes.com(纽约时报)、metafilter(一个大型的blog网站),youtube和百度hi......而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称csrf为“沉睡的巨人”。
四.csrf的原理
从上图可以看出,要完成一次csrf攻击,受害者必须依次完成两个步骤:
1.登录受信任网站a,并在本地生成cookie。
2.在不登出a的情况下,访问危险网站b。
看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到csrf的攻击”。是的,确实如此,但你不能保证以下情况不会发生:
1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
2.你不能保证你关闭浏览器了后,你本地的cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......)
3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。
以上内容转自:
具体步骤:
1、在html表单里面使用了@html.antiforgerytoken()就可以阻止csrf攻击。
2、相应的我们要在controller中也要加入[validateantiforgerytoken]过滤特性。该特性表示检测服务器请求是否被篡改。注意:该特性只能用于post请求,get请求无效。
3、至于js,我们的项目中引用的是
在js时要使用: $.ajaxantiforgery才行,
如:
 $.ajaxantiforgery({
            type: post,
            data: { groupname: $(#groupname).val(), groupphones: $(#groupphones).val() },
            datatype: json,
            url: /event/mass/addgroup,
            success: function (data) {
                if (data) {
                    alert(添加成功 );
                    $.unblockui();
                }
                else {
                    alert(添加失败 );
                }
         }
 })
注:对数据进行增删改时要防止csrf攻击!
(三)beginformantiforgerypost
orchard1.6中,module.txt文件中的设置antiforgery:enable及页面中beginformantiforgerypost的作用也是一样的,不再赘述!
(四)参考网址
http://www.cnblogs.com/dragon_mail/archive/2011/07/10/2102364.html
http://blog.csdn.net/luck901229/article/details/8261640
其它类似信息

推荐信息