跨站请求伪造(Cross-Site Request Forgery, CSRF),恶意网站经过脚本向当前用户浏览器打开的其它页面的 URL 发起恶意请求,因为同一浏览器进程下 Cookie 可见性,致使用户身份被盗用,完成恶意网站脚本中指定的操做。html
尽管听起来跟XSS跨站脚本攻击有点类似,但事实上CSRF与XSS差异很大,XSS利用的是站点内的信任用户,而CSRF则是经过假装来自受信任用户的请求来利用受信任的网站。浏览器
你能够这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。 CRSF能作的事情包括利用你的身份发邮件、发短信、进行交易转帐等,甚至盗取你的帐号。安全
CSRF的攻击原理以下图所示。服务器
所以,站点A会报据用户C的权限来处理恶意站点B所发起的请求,而这个请求可能以用户C的身份发送 邮件、短信、消息,以及进行转帐支付等操做,这样恶意站点B就达到了伪造用户C请求站点 A的目的。cookie
受害者只须要作下面两件事情,攻击者就可以完成CSRF攻击:架构
不少状况下所谓的恶意站点,颇有多是一个存在其余漏洞(如XSS)的受信任且被不少人访问的站点,这样,普通用户可能在不知不觉中便成为了受害者。分布式
1. 尽可能使用POST,限制GET网站
GET接口太容易被拿来作CSRF攻击,看第一个示例就知道,只要构造一个img标签,而img标签又是不能过滤的数据。接口最好限制为POST使用,GET则无效,下降攻击风险。spa
固然POST并非万无一失,攻击者只要构造一个form就能够,但须要在第三方页面作,这样就增长暴露的可能性。架构设计
2. 浏览器Cookie策略
IE六、七、八、Safari会默认拦截第三方本地Cookie(Third-party Cookie)的发送。可是Firefox二、三、Opera、Chrome、Android等不会拦截,因此经过浏览器Cookie策略来防护CSRF攻击不靠谱,只能说是下降了风险。
PS:Cookie分为两种,Session Cookie(在浏览器关闭后,就会失效,保存到内存里),Third-party Cookie(即只有到了Exprie时间后才会失效的Cookie,这种Cookie会保存到本地)。
PS:另外若是网站返回HTTP头包含P3P Header,那么将容许浏览器发送第三方Cookie。
3. 加验证码
验证码,强制用户必须与应用进行交互,才能完成最终请求。在一般状况下,验证码能很好遏制CSRF攻击。可是出于用户体验考虑,网站不能给全部的操做都加上验证码。所以验证码只能做为一种辅助手段,不能做为主要解决方案。
4. Referer Check
Referer Check在Web最多见的应用就是“防止图片盗链”。同理,Referer Check也能够被用于检查请求是否来自合法的“源”(Referer值是不是指定页面,或者网站的域),若是都不是,那么就很可能是CSRF攻击。
可是由于服务器并非何时都能取到Referer,因此也没法做为CSRF防护的主要手段。可是用Referer Check来监控CSRF攻击的发生,却是一种可行的方法。
5. Anti CSRF Token
如今业界对CSRF的防护,一致的作法是使用一个Token(Anti CSRF Token)。
例子:
1. 用户访问某个表单页面。
2. 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
3. 在页面表单附带上Token参数。
4. 用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。
这个Token的值必须是随机的,不可预测的。因为Token的存在,攻击者没法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽可能把敏感操做由GET改成POST,以form或AJAX形式提交,避免Token泄露。
注意:
CSRF的Token仅仅用于对抗CSRF攻击。当网站同时存在XSS漏洞时候,那这个方案也是空谈。因此XSS带来的问题,应该使用XSS的防护方案予以解决。
文章《Web安全之CSRF攻击》
书籍《大型分布式网站架构设计与实践》