博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
防御CSRF的第四种方法?
阅读量:7297 次
发布时间:2019-06-30

本文共 1752 字,大约阅读时间需要 5 分钟。

hot3.png

我们知道,一般防御CSRF有三种方法,判断referer验证码token

对于判断referer来说,虽然客户端带用户状态的跨域提交,js和as已经无法伪造referer了;但是对于客户端软件和flash的提交,一般是不带referer的,据说一些山寨浏览器也不带。那么就需要为此开绿灯,但这样使得外站的flash请求伪造无法被防御。

而验证码弊端明显:会对用户造成影响。

token的问题也有一些:时效性无法保证;大型服务时,需要一台token生成及校验服务器;需要更改所有表单添加字段。

而最近我在做之类的防御时,想出了另外一种方法,跟xeye、woyigui等人在群里讨论了一番,认为应该是可行的,所以拿出来分享一下,并让其他的牛人看看是否有什么弊端

其实原理非常简单,与token也差不多:当表单提交时,用js在本域添加一个临时的cookies字段,并将过期时间设为1秒钟之后,然后再提交;服务端校验有这个字段即放行,没有则认为是CSRF。

token防csrf的原理是:无法通过ajax等方式获得外域页面中的token值,xmlhttprequest需要遵守浏览器同源策略;而临时cookies的原理也是:cookies只能在父域和子域之间设置,也遵守同源策略。

我们可以简单看一个demo:

:

:

Cookies";var_dump($_COOKIE);?>

test.html为浏览器端的表单,里面有三个按钮:

第一个是正常的表单提交;第二个是添加临时cookies后提交表单;第三个是以hook submit事件来添加临时cookies并提交。

结果就像开头的图片演示那样,正常的表单提交不会出现临时cookies字段,第二个和第三个按钮提交则会出现。大家可以反复点击按钮来查看结果,但需要注意时间间隔需超过1秒。(当然可以将test.html拿到外域看看,不过要注意form的target不能指向iframe了,可以以新窗口打开。由于同源策略,cookies肯定是带不过去的)

不过这种方式只适用于单域名站点,或者安全需求不需要“当子域发生XSS隔离父域”。因为子域是可以操作父域的cookies的,所以它的缺陷也比较明显:这种方法无法防御由于其他子域产生的xss所进行的表单伪造提交。而一个区分分域的自校验token是可以防止从其他子域到本域的提交的。但如果对于单域而言,这种方法应该是足够的,并且安全性可能会略大于token。

和群里的几位大牛讨论了一下,也认为这种方式没有什么大问题,不过确实有一些小的疑问,譬如:

网络不流畅,有延迟会不会导致cookies失效。这个显然是不会的,因为服务端cookies是在提交请求的header中获得的。延时在服务端,不在客户端,而1秒钟足可以完成set Cookies+post header整个post表单的过程。

cookies的生成依赖于js,相当于这个token是明文的?这个的确,不管采取多少种加密,只要在客户端,就会被破解,不过不管怎样,csrf无法在有用户状态的情况下去添加这个临时cookies字段。虽然服务端curl等可以,但是无法将当前用户的状态也带过去。

外站是否可以伪造这个临时cookies呢?目前来看至少通过as和js无法向其他域添加和更改cookies的,通过服务端虽然可以伪造cookies,但获得不到目标域的用户状态。

如果目标域有XSS就完蛋了?恩,不过一般来说判断referer、token和简单的验证码(利用canvas识别?)也差不多完蛋了。

如果由于某种网络问题,获得不到cookies了呢?那么用户状态也不能获得了,用户只能再提交一次了。

ok,就这些!

说实话,这种新方法究竟是否真正有效我也没谱,说不定有某种BT的方式可以绕过?所以share一下,大家不妨看看是否真的有效。如果真有效,那么大概是一种最简单的,对代码改动最小,对服务器压力也最小的防御CSRF的方法了。

最后感谢下woyigui,提出了很多建议呵呵!

Monyer!

转载于:https://my.oschina.net/u/656588/blog/148486

你可能感兴趣的文章
hdu 5677 ztr loves substring 多重背包
查看>>
WCF学习
查看>>
django 基础进 COOKIE
查看>>
[Java 8] (10) 使用Lambda完成函数组合,Map-Reduce以及并行化
查看>>
@EnableWebMvc
查看>>
eclipse中输入的中文为繁体的问题
查看>>
.NET跨平台:在Linux Ubuntu上编译coreclr/corefx/dnx(20150617)
查看>>
[CQOI2016]手机号码
查看>>
Eclipse CDT 配置C /C ++ 标准库 (UBUNTU 12 )
查看>>
面霸吕国栋之:整理的一些面试题
查看>>
转 Python爬虫入门五之URLError异常处理
查看>>
转 Python执行系统命令的方法
查看>>
CSS 折角效果
查看>>
个人作业3---个人总结
查看>>
[分享]ip地址爬取过滤的shell
查看>>
差分数组
查看>>
Shiro 加密helloWorld
查看>>
关于安装sql2012出现的netfx3功能问题
查看>>
基础关3
查看>>
tar 解压缩
查看>>