CSRF攻击是什么?如何防范?

什么是CSRF?

CSRF(Cross-site request forgery,跨站请求伪造)攻击就是 攻击者利用受害者的身份,以受害者的名义发送恶意请求。与XSS(Cross-site scripting,跨站脚本攻击)不同的是,XSS的目的是获取用户的身份信息,攻击者窃取到的是用户的身份(session/cookie),而CSRF则是利用用户当前的身份去做一些未经过授权的操作。

CSRF可以盗用受害者的身份,完成受害者在web浏览器有权限进行的任何操作,例如:

  • 以你的名义发送诈骗邮件,消息
  • 用你的账号购买商品
  • 用你的名义完成虚拟货币转账
  • 泄露个人隐私

CSRF奏效的条件

要使 CSRF 攻击奏效,必须同时满足以下几个条件:

  • 浏览器支持(没有禁用)cookie
  • 目标网站没有做 CSRF 相关的预防措施
  • 目标网站基于 cookie/session 来做身份认证
  • 用户已在目标网站登陆,并且没有登出,并且没有清空 cookie,并且 cookie 没有过期

防范手段

服务端的预防CSRF攻击的方式方法有多种,但思想上都是差不多的,主要从以下2个方面入手:

  • 1、正确使用GET,POST和Cookie;
  • 2、在非GET请求中增加伪随机数;
最基本的手段:涉及敏感操作的请求改为POST请求

这个方法的确可以防范一些CSRF攻击,但是对于进阶攻击就无能为力了——POST请求一样可以伪造。所以这个方法不够安全。只能提高攻击的门槛。

一般手段
用户操作限制——验证码机制

方法:添加验证码来识别是不是用户主动去发起这个请求,由于一定强度的验证码机器无法识别,因此危险网站不能伪造一个完整的请求。
优点:简单粗暴,低成本,可靠,能防范99.99%的攻击者。
缺点:对用户不友好。

请求来源限制——验证 HTTP Referer 字段

方法:在HTTP请求头中有一个字段叫Referer,它记录了请求的来源地址。 服务器需要做的是验证这个来源地址是否合法,如果是来自一些不受信任的网站,则拒绝响应。
优点:零成本,简单易实现。
缺点:由于这个方法严重依赖浏览器自身,因此安全性全看浏览器。

  1. 兼容性不好:每个浏览器对于Referer的具体实现可能有差别。
  2. 并不一定可靠:在一些古老的垃圾浏览器中,Referer可以被篡改。
  3. 对用户不友好:Referer值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权。因此有些用户可能会开启浏览器防止跟踪功能,不提供Referer,从而导致正常用户请求被拒绝。
额外验证机制——token的使用

方法:使用token来代替验证码验证。由于黑客并不能拿到和看到cookie里的内容,所以无法伪造一个完整的请求。基本思路如下:

  1. 服务器随机产生token(比如把cookie hash化生成),存在session中,放在cookie中或者以ajax的形式交给前端。
  2. 前端发请求的时候,解析cookie中的token,放到请求url里或者请求头中。
  3. 服务器验证token,由于黑客无法得到或者伪造token,所以能防范csrf

参考:

Cross-site request forgery

浅谈CSRF攻击方式