背景
1、什么是CSRF攻击?
这里不再介绍CSRF,已经了解CSRF原理的同学可以直接跳到:“3、前后端分离下有何不同?”。
不太了解的同学可以看这两篇对CSRF介绍比较详细的参考文章:
如果来不及了解CSRF的原理,可以这么理解:有一个人发给你一个搞(mei)笑(nv)图片链接,你打开这个链接之后,便立刻收到了短信:你的银行里的钱已经转移到这个人的帐户了。
2、有哪些防御方案?
上面这个例子当然有点危言耸听,当然可以确定的是确实会有这样的漏洞:你打开了一个未知域名的链接,然后你就自动发了条广告帖子、你的Gmail的邮件内容就泄露了、你的百度登录状态就没了……
防御方案在上面的两篇文章里也有提到,总结下,无外乎三种:
用户操作限制,比如验证码;
请求来源限制,比如限制HTTP Referer才能完成操作;
token验证机制,比如请求数据字段中添加一个token,响应请求时校验其有效性;
第一种方案明显严重影响了用户体验,而且还有额外的开发成本;第二种方案成本最低,但是并不能保证100%安全,而且很有可能会埋坑;第三种方案,可取!
token验证的CSRF防御机制是公认最合适的方案,也是本文讨论的重点。
3、前后端分离下有何不同?
《CSRF 攻击的应对之道》这篇文章里有提到:
要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写