说这个原因之间,我们需要先了解一下什么叫CSRF。
CSRF
中文翻译过来就是跨站请求伪造(英语:Cross-site request forgery)
是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
感觉又不得不说XSS了。
XSS
叫跨站脚本攻击,就是利用了特殊手段在用户访问的网页中植入了恶意代码,可以是js脚本等,这些脚本就会在用户的浏览器上执行,达到攻击效果。
常用的XSS攻击手段和目的有:
1、盗用cookie,获取敏感信息。
2、利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
5、在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
跟XSS比起来,CSRF没有那么大的能力,但是并不是说他的危害就很小。
其是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。浏览器在访问一个网站的时候,往往就会带上这个网站在用户浏览器上设置的cookie,然后网站就会以为这真的是用户在进行操作,可能就会对用户造成损失。
举个例子:
假如一家银行用以运行转账操作的URL地址如下:http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一个恶意攻击者可以在另一个网站上放置如下代码: <img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">
如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金。
之前我们就说了,这都是因为浏览器在访问一个网站的网页的时候,往往就会携带该网站之前所设置的cookie(当然是这也不是绝对的,网站在设置cookie的时候,可以设置具体访问哪些站点才携带cookie,但是对于一些需要权限的网页如果需要验证的话,肯定会设置访问当前页需要携带cookie),你刚才登录了银行,进行了转账,然后银行就会给你设置cookie,然后攻击者去访问的时候,携带了cookie,银行就会以为是用户进行的操作,就出现问题了。
说了这么多,都是想说cookie存在的问题,而token就没有这个问题。
CSRF攻击的原因是浏览器会自动带上cookie,而不会带上token。
cookie:用户点击了链接,cookie未失效,导致发起请求后后端以为是用户正常操作,于是进行扣款操作;
token:用户点击链接,由于浏览器不会自动带上token,所以即使发了请求,后端的token验证不会通过,所以不会进行扣款操作