what's the CRSF ??

What's CSRF attack ?

CSRF(" Cross-site request forgery!" 跨站请求伪造) 
 
用实例讲原理:
我们假设一个银行网站A,一个网站B,一个用户(受害人),一个黑客,银行网站的转账URL是
http://bank./transfer?account=Marry&amount=10000&to=Mallory
 
1 用户在登陆银行网站A后,在session、cookie未过期的情况下,也没有退出登录,
2 此时用户浏览网站B,黑客网站B里面有个图片嵌套了网站A的转账接口URL,诱使用户去点击访问这个图片
3 当用户点击这个图片后,这个URL就开始向银行网站A请求并且得到响应,钱就从用户Marry账户转移到了Mallory账户下了。
4 在转账过程中,受害人Marry是毫不知情的,即使他查询日志,也发现该操作是他本人发起请求来转移的。
 
 
从上面的例子可得:

1 CSRF公交黑客借助受害者的 cookie 骗取服务器的信任,但是黑客并不能拿到 cookie,也看不到 cookie 的内容。
2 对于黑客来说能做的就是给服务器发送请求,以执行请求中所描述的命令,在服务器端直接改变数据的值,而非窃取服务器中的数据。

 
综上所述,我们可以得到哪些对象需要保护:
  •     1 我们要保护的对象是那些可以直接产生数据改变的服务,而对于读取数据的服务,则不需要进行 CSRF 的保护。比如银行系统中转账的请求会直接改变账户的金额,会遭到 CSRF 攻击,需要保护
  •     2 查询余额是对金额的读取操作,不会改变数据,CSRF 攻击无法解析服务器返回的结果,无需保护。
 
防范CSRF的几种策略:
  •      验证HTTP referer的值
    • 根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。
    • 比如我们要访问http://bank.example/transfer?account=Marry&amount=10000&to=Mallory,那么referer的值就是要求用户必须在bank.example这个页面下发起上面的URL请求才可以。如果是在网站B上发起这个转账URL请求,那么这个referer就是网站B自身了。
    • 说到这里,那么就说说如何通过referer来防范CSRF攻击了:
    1. 这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。
    2. 风险在于我们这个这个安全寄托于浏览器上面了,对于IE6 或者FF2等浏览器,都是可以篡改referer值的,即便更改不了,某些用户如果关闭了浏览器在请求的时候referer,那么网站会因为请求中没有referer值而拒绝合法用户的请求
  •     在请求地址中添加token并验证
    • 前面已经说了,黑客可以利用用户自己的cookie来执行URL请求,那么我们就要去放入一些黑客不能够伪造的信息,并且不存在cookie中,可以在http请求里面以参数的形式添加一个随机产生的token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
    • 对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,这样就把 token 以参数的形式加入请求了
  •     在http头中自定义属性验证
    • 这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

      然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。

       

       

      以上连接参考自:http://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/index.html

 
 
 
    
 
 
posted @ 2016-07-03 17:55  温柔易淡  阅读(421)  评论(0编辑  收藏  举报