-
Notifications
You must be signed in to change notification settings - Fork 0
crosandcsrf
Xiaolin Zhang edited this page Nov 2, 2019
·
1 revision
大家应该很收悉csrf了,我就不赘述了.总结一下现在通用的几种防csrf的方法.
- 通过在生成的form里添加隐藏字段.优点是简单,直观.缺点:纯api网站无法使用.
- 后端将csrf_token写进cookie,前端获得到之后写进请求body里.优点:通用,api也可以使用.缺点:delete和put之类的方法发请求是没有body,不能校验.
- 前端将获得到的token写到自定义header中.目前来看是最好的解决方案,有人提到请求头可能不兼容
cors是浏览器执行的跨域政策.基础的我就不写了,分享两个特别的地方:
- 简单请求是先实实在在发送到服务器上,然后服务器做校验不合法直接打回来.
- 前端想要定义除了规定的Header之外任何header,都会直接变成复杂请求.
做法很简单,让前端在每个请求前都加上
crsf_avoid_header: whatever
服务器校验一下有没有这个header就好了.
原理就很简单了,我们知道恶意网站无论如何是不能设置这个header的,想设置先变成复杂请求,然后判断一下是否同源,只要你没有信任恶意网站,那么除了你自己没人能带着header成功访问.
我发现这个问题之后,在v2ex发了帖子,发现很多人根本没有理解csrf是什么,争论的根本不是一件事.无奈只能去英文社区寻找支持,果然质量就搞了很多.
我想出来的方法更简单,而且足以防范crsf,但是为什么没有成为更广泛的做法呢?
- crsf攻击比制定corf要早.(没求证)
- flash这个坑爹货能绕过.
- 双重验证更保险.还能一定程度上防小爬虫和重复提交.
- Http Request 分裂,一些浏览器实现上的问题或者bug.
资源:
https://security.stackexchange.com/questions/10227/csrf-with-json-post
http://blog.alutam.com/2011/09/14/jersey-and-cross-site-request-forgery-csrf/
http://security.stackexchange.com/questions/22903/why-refresh-csrf-token-per-form-request