|
本帖最后由 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也没有修正这个问题) |
|