csrf是什么
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
上面的说法是比较官方的解释,下面进行通俗的说法:
身边比较常见的,譬如,让你登陆了网站账户(地址为:www.a.com) ,然后别人给你发了一个连接www.b.com/xxxx
,如果你点击了,那么你的账户里面的积分,或者其他的一些东西可能被操作。
原因为:你登陆了A网站,那么浏览器中有网站A的cookie,如果在B网站中写一个form提交表单,提交的post地址为网站A,js设置访问网站B表单自动提交,如果你在登陆网站A账户后点击B网站的这个url,就会提交表单,因为浏览器中有A网站的cookie,那么这个提交表单就会提交成功,譬如转账操作,这显然不是用户想要在A网站执行的操作,而被隐藏执行了
总体来说,csrf攻击的前提是,用户得先登陆网站A的账户,这样才有权限操作各种操作,
然后利用各种诱导让用户点击B网站的触发页面,跨站请求伪造,然后就可以执行相关的操作,因此csrf漏洞的触发是有条件的,这也就是很多xx链接不要点击的原因,但是,如果网站做了csrf的防范,点击了也不会有问题的
<input class="thiscsrf" type="hidden" value="-pJu7CfqMcpScHBs6vTyAyyylKUEOG_25ufQZi89oUKU1xaaXahY8jovHB2Zlb5lTtPd0kgPIamgrKo1bUnAHQ==" name="_csrf">
因为网站会在表单中加入一个csrf 选项,A站的信息提交用户信息的同时,也要带上这个csrf选项,提交了服务端,服务端会验证csrf,合法后才会通过,因此对于B网站提交过来的表单,是没有csrf的,因此请求会拒绝
那么问题来了B网站是否有其他途径获取A网站的csrf信息?有的!!因为js的ajax可以访问远程获取远程的信息,进行执行,不过值的庆幸的是,js ajax默认是不允许跨域的,如果跨域需要服务端通过cors开启,因此默认情况下是没有问题的,但是!!!如果php端加入了
header('Access-Control-Allow-Origin: *');
尤其是vue 这种前后端分离,还是基于浏览器的方式,有一些开发者为了方便,会这样设置,这样设置,在csrf漏洞范畴中是很危险的,这样B网站可以通过ajax访问A网站的内容(因为允许所有网站跨域ajax访问),然后解析出来csrf的信息,然后加入到表单中提交,还是会发起csrf攻击,csrf验证将会通过,因此线上环境不要这样设置,只将vue端的域名填写进去即可。
关于fecshop vue端的cors设置:http://www.fecshop.com/topic/1547
关于Yii2 csrf 防范的代码分析,这个文章分析的很好,可以参看这个:https://www.cnblogs.com/HKUI/p/6068453.html