php ci 局部缓存,CI缓存终极解决思路

博主指出在CodeIgniter(CI)框架中直接使用URI的MD5值作为缓存文件名可能存在缓存攻击风险,并提出使用方法+参数值的MD5值作为缓存文件名以确保唯一性。他还分享了自己CMS的缓存结构,通过目录分层提高性能,并建议修改CI的缓存类以支持更灵活的缓存命名。缓存文件名的生成考虑了控制器指定的名称,从而能够有效地管理和区分缓存群组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本帖最后由 vps4 于 2009-5-23 11:53 编辑

CI是直接用uri的MD5值来做缓存文件名

如果你直接这么用, 我认为是错误的!!!

应该使用method+参数值的MD5值做缓存文件名, 就不会存在缓存攻击问题, 这样能确保唯一性

看了你们讨论了这么久, 这么简单的问题怎么就说不清楚....

我自己写了一年多的CMS, 我是这么做我的缓存系统的

生成的缓存结构,应该像这样

cache/

posts/

a/

a23ce89c1a32d23ce89c1a32d23ce89c.txt

ab9cds2312d245233ce89c1a32d23ced.txt

b/

c/

lists/

searchs/

MD5值从哪来?

(a23ce89c1a32d23ce89c1a32d23ce89c.txt 这个MD5值是我随便打的, 生成这个MD5的不应该是URI, 而应该是在controller里指定的名称, 这样不但可以有效管理缓存群组, 而且也能保证唯一性)

为什么会有abc目录?

(这是为了性能考虑, 取MD5值第一位做第一层目录名, 如果文件巨多, 可以取第二位再分)

总结:

终极完美解决办法就是必须改CI的缓存类

以实现

$this->cache($cache_time, $cache_group, $cache_name);

使用方法应该像这样

$this->cache(3600, 'posts', '1');

一个完善的缓存系统, 一定要可以自定义缓存文件名

补充:

不好意思,昨天半夜比较晕,没有说到重点,我是拿出了CI的URI ,没有用route

帖点代码吧

switch ($uri->segment(1)) {

case 'page':

$page = intval($uri->segment(2));

$page = $page ? $page : 1;

// cache

if ( $cache_output->start($page, 'page', get_option('cache_list')) ) exit;

$perpage = get_option('list_num');

$startnum = $perpage * ($page - 1);

$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM $db->posts WHERE 1=1 ORDER BY post_date DESC LIMIT $startnum, $perpage";

$main_posts = $gl->get($sql);

$total = $db->get_var('SELECT FOUND_ROWS()');

$pages = ceil($total / $perpage);

$uri_before = site_url('page/');

$uri_after = '/';

$tpl_name = 'index';

break;

}

$cache_output->end();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值