1.验证码防御
验证码防御被认为是对抗CSRF最为简单而且有效的防御方法。
CSRF在用户不知情的情况下完成对应操作,而验证码强制用户与应用程序交互,才能最终完成操作。通常情况下,验证码能够很好的遏制CSRF。
出于用户体验考虑,不可能每一个操作都加入验证码。所以验证码只作为辅助手段,不能作为防御CSRF的主要解决方案。
- 验证码防御也可以被认为是二次验证
2.Referer Check防御
Referer Check主要用于防止盗链。同理也可以用来检查请求是否来自合法的“源”。
比如用户修改密码,一定是在登录系统后台之后进行操作。所以在修改提交表单的时候,一定会从系统后台页面提交。携带Referer头。如果Referer不是当前系统的域,那么极有可能遭受CSRF。
缺陷:服务器并非任何时候都可以取到Referer。例如HTTPS跳转到HTTP。
3.Anti CSRF Token防御
CSRF本质原因:重要操作的所有参数都是被恶意攻击者猜测到的。
那么防御措施就是生成一个随机且不被轻易猜测的参数。目前大多数防御都采用token(不可预测)。
4.Token泄露
例如:GET型Token泄露
页面包含 那么请求中的Referer就会携带对应的GET Token。
例如:POST型Token泄露
利用XSS漏洞读取Cookie,获取存储在其中的Token值。