CSRF是什么?

Posted Web前端精髓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF是什么?相关的知识,希望对你有一定的参考价值。

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。


攻击细节

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。


CSRF原理

下面一张图简单阐述了CSRF的原理



从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成以下两个步骤:

  • 登录受信任网站A,并在本地生成Cookie。

  • 在不登出A的情况下,访问危险网站B。
    看到这里,你也许会问:“如果我不满足以上两个条件中的一个,我就不会受到CSRF攻击”。是滴,确实如此,但是你不能保证以下情况不会发生:

  • 你不能保证你登录了一个网站之后,不再打开一个tab页面并访问其它的网站(黄网)。

  • 你不能保证你关闭浏览器之后,你本地的Cookie立刻过期,你上次的会话已经结束。

  • 上述中所谓的攻击网站,可能就是一个钓鱼网站或者黄色网站。


例子

我们先假设支付宝存在CSRF漏洞,我的支付宝账号是zhx,攻击者的支付宝账号是xxx。然后我们通过网页请求的方式 

http://zhifubao.com/withdraw?account=zhx&amount=10000&for=luffy 可以把我账号zhx的10000元转到我的另外一个账号luffy上去。通常情况下,该请求发送到支付宝服务器后,服务器会先验证该请求是否来自一个合法的session并且该session的用户已经成功登陆。攻击者在支付吧也有账号xxx,他知道上文中的URL可以进行转账操作,于是他自己可以发送一个请求 

http://zhifubao.com/withdraw?account=zhx&amount=10000&for=xxx 到支付宝后台。但是这个请求是来自攻击者而不是来自我zhx,所以不能通过安全认证,因此该请求作废。这时,攻击者xxx想到了用CSRF的方式,他自己做了个黄色网站,在网站中放了如下代码:

http://zhifubao.com/withdraw?account=zhx&amount=10000&for=xxx 并且通过黄色链接诱使我来访问他的网站。当我禁不住诱惑时就会点了进去,上述请求就会从我自己的浏览器发送到支付宝,而且这个请求会附带我的浏览器中的cookie。大多数情况下,该请求会失败,因为支付宝要求我的认证信息,但是我如果刚访问支付宝不久,还没有关闭支付宝页面,我的浏览器中的cookie存有我的认证信息,这个请求就会得到响应,从我的账户中转10000元到xxx账户里,而我丝毫不知情,攻击者拿到钱后逍遥法外。所以以后一定要克制住自己,不要随便打开别人的链接。


透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。


防御措施


检查Referer字段


这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。


添加校验token



以上是关于CSRF是什么?的主要内容,如果未能解决你的问题,请参考以下文章

什么是CSRF跨站请求伪造?(from表单效验csrf-ajdax效验csrf-Ajax设置csrf-CBV装饰器验证csrf)

什么是CSRF 攻击

什么是CSRF(跨站请求伪造)?

CSRF攻击

什么是CSRF攻击,如何预防

Web Security 之 CSRF