CSRF攻击

一、CSRF攻击

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

一张图说明CSRF:
CSRF攻击_第1张图片
通过这6个步骤达到攻击的目的。

简单来讲就是攻击者(黑客,钓鱼网站)盗用了你的身份,以你的名义发送恶意请求,这些请求包括发送邮件、发送消息、盗取账号、购买商品、银行转账,从而使你的个人隐私泄漏和财产损失。

以下条件二者缺一不可:

  • 登录受信任的网站A,并在本地生成Cookie
  • 在不登出A的情况下,访问危险网站B

CSRF防御方法:

1.验证HTTP Referer 字段

根据HTTP协议,在HTTP request头部有一个Referer字段它记录了该HTTP请求所在的地址,表示HTTP请求从哪个页面发出的。如果攻击者要实行CSRF攻击,那么他只能在自己的站点构造请求,此时Referer的指就是指向黑客自己的网站。因此,若想防御CSRF攻击,目标站点只要验证每一个请求的Referer值。

这种方法的好处就是简单易行,只需要在后台添加一个拦截器来检查Referer即可。然而这种方法并不是万无一失的,Referer的值是由浏览器提供的,一些低级的浏览器可以通过某种方式篡改Referer的值,这就给了攻击者可乘之机;而一些高级浏览器处于安全考虑,可以让用户设置发送HTTP请求时不再提供Referer值,这样当他们正常访问支付宝网站时,因为没有提供Referer值而被误认为CSRF攻击,拒绝访问。实际应用中通常采用第二种方法来防御CSRF攻击。

2.添加token验证

CSRF攻击之所以能够成功,是因为攻击者可以完全伪造用户的请求,该请求中所有的用户验证信息都存在cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过安全验证。要防止CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于cookie之中。可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器建立一个拦截器来验证这个token,如果请求中没有token或者token不正确,则认为可能是CSRF攻击而拒绝该请求。
现在业界一致的做法就是使用Anti CSRF Token来防御CSRF

  • 用户访问某个表单页面
  • 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中
  • 在页面表单附带上Token参数
  • 用户提交请求后,服务端验证表单中的Token是否与用户Session(或Cookie)中的Token一致,一致为合法请求,不是则非法请求。

3.验证码

验证码,强制用户必须与应用进行交互,才能完成最终请求。通常情况下,验证码能够很好的遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段。

4.尽量使用POST,限制GET

GET接口能够直接将请求地址暴露给攻击者,所以要防止CSRF一定最好不要用GET。当然POST并不是万无一失,攻击者只需要构造一个form表单就可以,但需要在第三方页面做,这样就增加了暴露的可能性。

5.在HTTP头部添加自定义属性

这种方法也是使用token并验证但是它是把token放在HTTP请求头部中。通过使用AJAX我们可以在我们的请求头部中添加我们的自定义属性,但是这种方法要求我们将整个站的请求全部改成AJAX,如果是新站还好,老站的话无疑是需要重写整个站点的,这是很不可取的。

你可能感兴趣的:(前端,网络安全)