|
关于 CI 缓存问题的讨论很早就进行过了,先来个传送门 http://codeigniter.org.cn/forums/thread-1929-1-1.html
其中一个我认为可以由 CI 自动处理的就是阻止通过 URL 传递任意个数的参数,然后再由程序员自己判断每个参数是否合法,合法则缓存,否则直接 404 错误。(判断是否合法的方法有很多,比如到数据库中验证 ID 是否存在等等。。。)
判断控制器方法的参数个数用到了 PHP5 的反射(Reflection),这方面的知识,可以参考 PHP 手册。
在 CI 中我使用了钩子(Hook)来进行自动验证。
首先在 application/config/config.php 中设置:
PHP复制代码 $config['enable_hooks'] = TRUE; 复制代码
然后在 application/config/hooks.php 中设置:
PHP复制代码 $hook['pre_controller'] = array(
'class' => 'UriArgs',
'function' => 'validate_args',
'filename' => 'UriArgs.php',
'filepath' => 'hooks'
); 复制代码
最后在 application/hooks 目录中添加 UriArgs.php 文件:
PHP复制代码 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class UriArgs {
public function validate_args ()
{
$RTR =& load_class ('Router');
$class = $RTR->fetch_class();
$method = $RTR->fetch_method();
if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($class))) )
{
show_404 ("{$class}/{$method}");
}
$class_reflection = new ReflectionClass ($class);
$method_reflection = $class_reflection->getMethod($method);
$URI =& load_class ('URI');
$argnum = count(array_slice($URI->rsegments, 2));
if ($method_reflection->getNumberOfRequiredParameters() > $argnum || $method_reflection->getNumberOfParameters() < $argnum)
{
show_404 ("{$class}/{$method}");
}
}
}
/* End of file UriArgs.php */
/* Location: ./system/application/hooks/UriArgs.php */ 复制代码
经过以上设置,URL 分段传参的个数必须严格和方法定义的参数一致,否则将报 404 错误,这就在一定程度上防止了恶意缓存攻击的可能性。
附上 CI 钩子手册:http://codeigniter.org.cn/user_guide/general/hooks.html
此代码主要参考了:http://codeigniter.com/forums/viewthread/128873/
注意:此代码只支持 PHP 5.0.3 以上版本!
如果大家发现什么问题,或者有不清楚的地方,请及时反馈! |
|