一、前言
跨站点请求伪造(Cross-SiteRequest Forgeries, CSRF),是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击;有如下危害:
1、利用已通过认证的用户权限更新设定信息;
2、利用已通过认证的用户权限购买商品,虚拟货币转账;
3、利用已通过认证的用户权限在留言板发表言论;
二、攻击原理:
第一步:验证用户访问存在CSRF漏洞的网站A,网站A会给用户返回cookie,以便后面可以免登陆;
第二步:此时用户在同一浏览器打开一个有而已攻击代码的网站B,网站B返回一些攻击的代码,这些代码要求请求A网站;
第三步:浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据该验证用户的cookie信息以及权限处理该请求;
三、浏览器的cookie策略
上面讲到,网站B之所以能够通过网站A的验证,是因为B网站成功发送cookie的缘故。浏览器的cookie分为两种,一种是临时cookie,叫Seesion Cooie;另一种是'Third-party Cookie',也称‘本地cookie’。两者区别是在于,Third-party Cookie是服务器在Set-Cookie时指定的Expireid时间,只有到了Expire时间后Cookie才会失效,所以这种Cooki会保存在本地;而Session Cookie则没有Expire时间,所以浏览器关闭后,Session Cookie就失效了。
在浏览器的进程中,若是一个网站设置了Session Cookie,那么浏览器进程声明周期中,即使浏览器打开了一个新的额tab页,Session Cookie也都是有效的。Session Cookie保存在浏览器进程内存空间里面;而Third-party Cookie则保存在本地。
如果浏览器从一个域的页面中,要加载另外一个域的资源,由于安全考虑(p3p策略会有副作用,浏览器将不再拦截第三cookie的发送),某些浏览器会阻止Third-party Cookie的发送。
四、防御CSRF
1、验证 Referer check;
检查请求是否来自合法的‘源’,和‘防止图片盗链’同理。但是不能保证每次服务器都能拿到referer字段,比如在https跳转到http就不会发送referer;
2、使用手机或邮件验证码;
3、重要数据采用post请求,填写表单验证,但是破坏者可能会伪造form提交。
4、Anti CDRF Token
业界推崇这个方法。在请求中提添加一个token字段,如:www.hao123.com?name=abc&age=123&token=[random(seed)];token为客户端和浏览器的秘密,其他人不知道。一般要保证token的保密性和随机性。