CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。
XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(攻击的条件要求高) 和 难以防范,所以被认为比XSS更具危险性。
一、CSRF攻击的原理
要完成一次CSRF攻击,必须依次完成4个步骤:
1、登录受信任网站网站A,比如是某银行网站,你去查账,该网站会在本地生成Cookie。
2、在不登出某银行网站A的情况下,或者关闭网页但是Cookie没有过期的时候。去访问危险网站B。
3、危险网站B,做了一些马脚,它在网页上放了一个图片 <img src="银行网站A?转账请求链接"> ,访问时就会自动发出一个GET类型的转账请求向银行网站A。或者是通过<iframe >发送了一个post转账请求的表单向银行网站A,它会带着之前没有失效的银行网站A的Cookie
4、银行网站A收到该请求,验证Cookie通过,发起转账。然后你的钱就不见了
CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!
二、如何CSRF防御
CSRF的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的CSRF防御也都在服务端进行。下面说几种比较常用的解决方法:
1、验证码
这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,或则重要业务请求要短信验证码等,这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,对于用户体验也非常差。
2、Referer Check
Referer Check在Web最常见的应用就是“防止图片盗链”。同理,Referer Check也可以被用于检查请求是否来自合法的“源”(Referer值是否是指定页面,或者网站的域),如果都不是,那么就极可能是CSRF攻击。
但是因为服务器并不是什么时候都能取到Referer,所以也无法作为CSRF防御的主要手段。但是用Referer Check来监控CSRF攻击的发生,倒是一种可行的方法。
3、Anti CSRF Token现在业界对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)
原理:
用户访问某个表单页面。
服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
在页面表单附带上Token参数。
用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。
这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。
参考:https://www.toutiao.com/i6792544812361843204/
还没有评论,快来发表第一个评论!