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

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

    [复制链接]
发表于 2009-4-28 19:23:00 | 显示全部楼层
80# visvoy

呃,怎么就说和你不通呢?
cache 类的职能是生成缓存、读取缓存。hex 提供的那两个解决方案,核心思想就是在该生成缓存时候生成缓存。但是什么时候生成缓存,是 Cache 类的工作范围吗?任何现成的代码都不可能解决 Cache 类合适生效的问题。
就像 Input 类,不可能实现所有过滤,只能是用 Validate 类来补充。Validate 只是验证字符串,简单,把常用的字符串用正则表达式整理出来就ok,比如email,但是也不能覆盖所有的,在一些特定的情况下你还是得自己写正则表达式,难道让一个程序员写验证用的正则表达就是 CI 或者 php 的漏洞?[注1]
回到 Cache 类,Cache 类不能满足你所有的过滤条件的,就你 #54 提出的方案里,也只是部分过滤,限制segments 个数,那我就在你的 segments 个数内用你提出的方法整垮服务器:将一个你设置为合法的 segment 从1递增到1E。你可以说在数字上可以做限制,比如1k。很好,那有些不是数字的你怎么处理,用你的说法就是大众的眼光来看,我要通过用户的nick访问他的资料,用户nick以字母或者下划线开头,之后可以加数字至少6位,最多12位,那我也可以在你的“安全措施”之下生成 (26+1)*(26+10+1)^5 到 (26+1)*(26+10+1)^11 个缓存,一样整垮你的服务器。
这真的是一个误会,什么时候该使用缓存相当于执行 Validate 一样,Cache 类就是负责什么静态数据的写入、读取。至于为什么 CI 没能提供一个有效的 “Cache 使用情况的 Validate”,是因为这样的代码不存在,只有程序员根据实际情况去判断什么时候写入缓存。
如果你担心类似于“http://ci-site.com/index.php/index/index/1/2/3”的 url 不能访问“http://ci-site.com/index.php/index/index/1”的缓存就是一种失败的话,我不好说你什么了,因为这种情况只有你在恶意访问的情况下才去这么向服务器发起请求,平时访问的都是页面上生成的链接,也就是说前者属于不需要缓存的对象。你会在自己的页面上生成无数垃圾链接?你可能要反驳说,那这么样动态生成页面很耗资源的,服务器也会被搞垮,恭喜你,这次你答对了,不然大家也不会花几百万卖硬件防火墙来抵御 DDOS 攻击了。
我想解决方案其实很简单:在合适的时候进行缓存。但是什么时候是合适的时候,没有任何现成的代码能解决你下一次面临的问题。作为程序员,很重要的一点就是知道自己掌握了什么、什么时候能用它们、超出它们功能范围的时候如何修正或者加强。我想楼主最大的误点就是不知道 Cache 类的真正职能是什么。

[注1] php 有内置的 validate 库。

点评

说得很好  发表于 2012-8-6 13:21
 楼主| 发表于 2009-4-28 19:28:31 | 显示全部楼层
不是数字的很好解决啊,你不会没想到吧?
if (!$this->db->get_where('TABLE', array('USERNAME' => $username)))
    exit("错误");

CI的缓存漏洞焦点集中在segment个数,而不是segment范围,
用segment范围攻击,是因为存在segment个数判断不严密的漏洞

前面我已经发布过解决代码了,恳请有空看一下再来讨论

CIO只是个信息官而已?对CI了解程度也就那样罢了
 楼主| 发表于 2009-4-28 19:34:18 | 显示全部楼层
本人以前不太迷信框架,开发project都是自己写框架+应用
http://www.rcvip.net
http://www.wdi8.com

去年发现CI很好用,才转用CI,怎么啦?发现CI漏洞不让说吗?
还问我懂不懂CI,整套CI源码我都看过了,就是因为她的接口方便才决定用。

讨论技术问题,请你不要搞人身攻击,没意思,这不是灌水论坛
发表于 2009-4-28 19:49:03 | 显示全部楼层
82# visvoy

有意思~我觉得有意思~
开始我没有看前面别人给你的回复,现在我看了一部分,我觉得我说的很大部分其他人都已经说过了——在合适的时候生成缓存。至于什么时候是合适的,没有现成的代码能一次性搞定所有业务需求。你可以这次回个贴补充一个方法[连接到数据库验证一次,这个我在77楼也已经写了]、下次再回个帖补充方法,而且都是针对特定情况提出的解决方法,至于多少我没考虑到也没提出来的情况,我不知道~你也不能保证你现成的代码能解决它们。大部分时候我们是要根据具体业务逻辑进行后置验证[在业务代码完成之后、输出之前]是否需要缓存。你一直想着有一个方案[前置验证,在业务代码之前完成之前就能提供一个验证]能解决所有问题,而这整个方案本身就是不存在的。CI 官方不推出这种万能代码,不是不乐意,是没人能做到。

点评

这种需求本来就没有必要在框架层面考虑,大部分属于业务需求  发表于 2012-8-6 13:24
发表于 2009-4-28 19:58:45 | 显示全部楼层
83# visvoy

我觉对没有人身攻击的意思,只是用“你”、“我”说话显得距离近一些。
发表于 2009-4-28 20:28:14 | 显示全部楼层
我认为 visvoy 朋友没必要这么激动,如果我要是认为不允许提出 CI 的问题,我早就删除这个帖子了,也不会放到推荐主题里。
但是,我认为这个没有楼主所说的这么严重。即使是漏洞也存在严重程度,但是楼主某些用词比较吓人,容易误导初学者。

PS: 我声明一下,CI 不是我开发的。
发表于 2009-8-26 11:17:59 | 显示全部楼层
所有人的发言我都 看了 首先感谢visvoy 的解决方案 别管怎么样 他的扩展代码解决了大家被攻击的问题 其次在耦合方面也比较好 不用去每个方法都去验证 从这2点来看楼主还是比较有思想的 其他的观点通通不重要
发表于 2009-8-26 11:37:30 | 显示全部楼层
能不能在 这个帖子的某个地方 总结一下知识点,和解决方案,从头看到尾,页数太多了,
而且 既然 都有 稳定的解决方案了,能提交到官方,给予以后版本当中改进?

不好意思,这样的要求是对 CI 中文网站 的 要求是不是太高了?
发表于 2009-8-26 12:15:00 | 显示全部楼层
发表于 2009-10-29 15:55:39 | 显示全部楼层
回复 54# visvoy

try 了一下,结果发现:
    index.php/controller/function/1/2
    index.php/controller/function/1/2/3
    index.php/controller/function/1/2/3/4
这样是没问题。。
    index.php/controller/function/1/2
    index.php/controller/function/2/2
    index.php/controller/function/3/2
这样还是会有很多缓存文件滴。。。

本版积分规则