用户
 找回密码
 入住 CI 中国社区
搜索
楼主: visvoy
收起左侧

[讨论/交流] 脆弱的CI缓存系统,1天攻陷你的CI网站

    [复制链接]
发表于 2012-4-16 18:16:15 | 显示全部楼层
我没仔细研究过代码,但是我觉得这个问题很好解决
比如 我的站是
http://www.abc.com/userinfo/getuser/username/

其中username是变量
我是程序员 我很清楚我这个function里只需要一个segment(3),所以我在FUNCTION里通过URL 判断SEGMENT数量 如果超过3个,那么,这个URL非法
这样 解决了 http://www.abc.com/userinfo/getuser/username/1/2/3/4/5/6/7/8这种的


至于“看起来合法”的类似
http://www.abc.com/userinfo/username
如果有人遍历username 我的查询肯定是不符合结果的 这种页面我可以在逻辑控制上不执行到this->output->cache()就可以了嘛
发表于 2012-7-11 14:58:22 | 显示全部楼层
这个确实是 CI 的问题,我当时跑偏了。
Visvoy 开始提出这个问题的时候大家都在讨论 404,我也是只考虑 404,鸡同鸭讲没结果。
实际上这个问题严重的地方是对于“合法请求”也会生成垃圾缓存文件,而这一点 CI 并没有提供有效的指引在使用缓存是要处理未使用的 segments 的问题。

两个 uri:
HTML复制代码
 
/news/show/1
/news/show/1/111
 
复制代码


控制器
PHP复制代码
 
class News extends CI_Controller
{
        public function show($id)
        {
                // some code ..
        }
}
 
复制代码

一般情况下只对传入为参数的 segments 做了处理,只要 $id 是 1 或者其他“合法”的值,就绕开了 404,而其他 segments 则在生成缓存时依然发挥作用,比如刚才的 111。

当然,对于 404 的处理是开发者的问题,不是 CI bug。但是对“合法请求”的处理来看,这确实是个 bug。
对于这种“合法请求”,如果是通过 segments 去做 validate,业务成本太高,不便开发、也不便维护。

总结一下现有方案:
visvoy#54楼 是一个方案,不过通过 $this->uri->segment(n) 获取 uri 参数比直接使用 method 参数稍微复杂一些,要改变原有习惯,函数类参数要通过第三方获取,而不是直接通过函数参数来使用。
doom12#92楼 给出了一个不错的思路,需要修改的代码很少,只要额外传入传入唯一 id 给 $this->output->cache() 即可。
Hex  给了一个更灵活的解决方案URL 分段传参验证钩子,增强 CI 缓存防攻击的能力,因为不改变任何现有的代码习惯和规范。

我们正在讨论有没有更好的方式解决这个问题。
发表于 2012-7-11 15:03:03 | 显示全部楼层
BruceWolf 发表于 2012-7-11 14:58
这个确实是 CI 的问题,我当时跑偏了。
Visvoy 开始提出这个问题的时候大家都在讨论 404,我也是只考虑 404 ...

哎呀,难得的打了这么多字
发表于 2012-8-6 13:27:23 | 显示全部楼层
zhaoxuanyi 发表于 2009-8-26 11:37
能不能在 这个帖子的某个地方 总结一下知识点,和解决方案,从头看到尾,页数太多了,
而且 既然 都有 稳定 ...

官方肯定不会考虑这种需求的,你以为官方开发缓存的时候,会注意不到这样一个垃圾URI的产生,因为这个需求,是需要程序猿自己去因地制宜地考虑和开发的
发表于 2012-11-21 23:50:01 | 显示全部楼层
本帖最后由 mxdci 于 2012-11-21 23:53 编辑

这种缓存机制是单个文件缓存。
我上次在落伍(im286)看到有个缓存头像的机制是把头像缓存在10文件里面
例1.dat,2.dat 。。。10.dat
这样的网站搬家方式又快又好使。

不知道ci有没有这样的扩展。

http://www.im286.com/thread-4678415-1-1.html
发表于 2012-11-22 10:41:07 | 显示全部楼层
这个帖子的跨度真是长啊。。哈哈。。
我正在想用CI缓存,就搜了这篇。。让我提前做好准备,谢谢楼主提出来。。
发表于 2014-1-29 22:11:42 | 显示全部楼层
URL处理好  攻击不到的
发表于 2014-1-30 15:01:27 | 显示全部楼层
对URL和控制器处理好   轻松解决这个问题
发表于 2014-2-2 14:57:33 | 显示全部楼层
这个帖子跨度也太长了吧~  一只手马上不够用了~~~~
发表于 2014-2-4 01:32:30 | 显示全部楼层
357058607 发表于 2014-1-29 22:11
URL处理好  攻击不到的

你挖坟了==这帖子一年多没人回复了。。。。

本版积分规则