|  | 
 
| 本帖最后由 visvoy 于 2009-3-14 11:15 编辑 
 CI自带的缓存系统确实很方便,但她存在一个很大的弊端,看缓存系统的源码:
 CI把md5(index.php+uri_string)作为缓存文件名(没完全copy,详见libraries/output.php)
 这个uri_string允许URI串夹杂垃圾信息,比如:
 http://ci-site.com/index.php/index/index/1
 http://ci-site.com/index.php/index/index/1/2
 http://ci-site.com/index.php/index/index/1/2/3
 上面三个请求,CI将生成3个不同的缓存文件
 
 问题来了,假如攻击者写一个并发访问脚本:
 每秒并发访问100次(任何adsl用户都有足够带宽发起攻击)
 循环访问 index.php/index/index/1 至 index.php/index/index/10000000
 那么服务器将生成一千万个首页垃圾缓存,在同一个目录里面!
 假如你的网站首页html有10kb(一般来讲,10kb作为首页不算大)
 这个缓存目录的尺寸将达到:10kb x 10,000,000 = 100GB
 完成攻击所需时间:大约27小时
 
 此时你的网站面临两个问题:
 1. 访问每个CI页面极其缓慢,因为缓存目录有1000万个文件,文件系统反应迟钝
 2. CI所在磁盘分区被挤爆,所有CI缓存无法写入(你的分区可能超过100GB,但挤爆只是时间问题)
 
 *如果你把缓存目录设置到ramdisk里面,很快就会内存不足~
 
 由于CI不会主动删除过期缓存(访问到对应的URI时候才更新),
 这1000万个垃圾文件将长期驻留在服务器中,让网站永久慢如蜗牛
 
 缓存文件攻击,对所有版本CI都有效(最新1.7.1也没有修正这个问题)
 | 
 |