Hex 发表于 2009-4-8 07:35:11

呵呵,楼主既然有好的想法和代码就要分享哦!:lol

visvoy 发表于 2009-4-8 07:38:31

本帖最后由 visvoy 于 2009-4-8 08:47 编辑


我上面那个例子里,加了验证,没有增加耦合吧?

这个。。。。。既然我们没有忘记加“$this->output->cache(10);”,为什么会忘记加验证呢?这个是我们自己的疏忽,不能怪CI吧,呵呵。
BillyFan 发表于 2009-4-7 21:54 http://codeigniter.org.cn/forums/images/common/back.gif
1. 谈耦合是放在project里面,单个method或几个method的project耦不耦没虾米讨论价值
2. 46L的例子根本防不住cache漏洞,谈耦合没意义
3. 48L的例子放大一下看:
如果这是一个project的method,而project很可能需要readpost/1/2/3
三个uri segment,其中/2和/3不一定是数据库查询参数,按你的思路,
必须在检测能否cache的时候加入/2和/3检测,
再放大一点:倘若/2是个区域合理性参数,要再次变更cache相关的if判断
再再放大一点:几十几百method可能都要修改/2/3的cache检测,还有部分/2的区域性判断
最后到project:除了必要修改(老板要求的),你每次还要花费时间去修改几十几百个cache合理性判断

因为你的缓存接口依赖于每个缓存的实现,违反了依赖倒转原理,也就是说耦合了

那么,解释第二条引用就方便了,你每次要额外修改缓存判断代码,这肯定增加了工作量,且是无意义的工作量(本来可以修改接口避免的),于是隐性出错几率会相应增加(某段代码可能写了几个月之后再来修改,你能完全记住吗?何况还可能是你修改他人的代码)

visvoy 发表于 2009-4-8 07:45:05

呵呵,楼主既然有好的想法和代码就要分享哦!:lol
Hex 发表于 2009-4-8 07:35 http://codeigniter.org.cn/forums/images/common/back.gif
kaokao,原来斑竹一职潜水哇,等着,我还要从项目里面抽代码出来。。。。。。。

visvoy 发表于 2009-4-8 07:57:08

解决办法:
1. 先扩展URI类
class MY_URI extends CI_URI
{
// 记录被调用过的最大 segment 序号,默认=2 (1=Controller, 2=action)
var $_goodseg = 2;

// HOOK: 记录曾经使用过的 segment 的最大序号,用来过滤垃圾 seg
function segment($n, $no_result = FALSE)
{
if ($n > $this->_goodseg)
{
   $this->_goodseg = $n;
}
return parent::segment($n, $no_result);
}

// EXTEND: 只获取曾经被 ::segment() 方法调用过的最大序号之内的 segment 数组集合
function good_rsegment_array()
{
   return array_slice($this->rsegments, 0, $this->_goodseg);
}
} // END class MY_URI

2. 再扩展OUTPUT类
class MY_Output extends CI_Output
{
// HOOK: 防止写垃圾缓存
function _write_cache($output)
{
$CI = &get_instance();
$t = $CI->uri->uri_string;
$CI->uri->uri_string = implode('/', $CI->uri->good_rsegment_array());
if ('/' == substr($t, 0, 1))
{
   $CI->uri->uri_string = '/'.$CI->uri->uri_string;
}
parent::_write_cache($output);
// 恢复 uri string ,以供其他物件调用
$CI->uri->uri_string = $t;
}
} // END class MY_Output

3. 带缓存的method要用$this->uri->segment(n)来获取uri参数

这样就在接口限制了生成垃圾缓存,而对于缓存实现,不用添加任何缓存判断代码

visvoy 发表于 2009-4-8 08:01:47

本来想等山姆大叔的更新,既然有人要求,就发出来了

Hex 发表于 2009-4-8 13:38:25

感谢 visvoy 分享他的代码!加分!

明河共影 发表于 2009-4-9 08:42:54

听楼主这么一分析,的确存在这个弊端,看来还是使用其他的缓存

commonuser 发表于 2009-4-9 15:09:25

非常感谢分享。

doutu 发表于 2009-4-9 22:08:19

用Kohana吧,还可以按tag缓存,自动垃圾收集,可选4,5种方式缓存

arxiba 发表于 2009-4-10 15:44:50

没想到啊~!
页: 1 2 3 4 5 [6] 7 8 9 10 11 12
查看完整版本: 脆弱的CI缓存系统,1天攻陷你的CI网站