|
本帖最后由 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(); |
评分
-
查看全部评分
|