CI URI 传递中文问题

来源:互联网 发布:360手机抢购软件 编辑:程序博客网 时间:2024/06/06 09:05
比如下面的路径: http://www.example.com/search/name/中文字符,但是一直报错:Disallowed Key Characters.之前一直以为是system/library/URI.php的问题。不断的去修改系统的 
$config['permitted_uri_chars'] = 'a-z A-Z 0-9~%.:_\-';和URI.php里面的_filter_uri($str)函数
无奈之下,搜索这句报错信息的来源,结果发现是在system/library/URI.php里面的_clean_input_keys($str)这个函数,因为中文的编码在这个地方没有通过正则表达式的匹配,只能被无情的挂掉。 

总结:CI过滤URI中的字符有两道防线,第一道防线,是Input.php类里面的_clean_input_keys($str)函数,通过正则匹配,及时卡掉非法字符,第二道防线是URI.php里面的_filter_uri($str),通过系统设定的$config['permitted_uri_chars']来进行正则的匹配。卡掉非法的字符。但是我又感到了CI框架的一个缺陷。就是Input.php和URI.php里面的过滤函数各为其主,采用不同的正则表达式进行匹配,URI.php里面采用的是正统的$config['permitted_uri_chars'],Input.php采用的是固定的”/^[a-z0-9:_\/-]+$/i“。这样,即便在$config['permitted_uri_chars']里面设置了中文的匹配条件,也会在Input.php层被卡掉。 

解决办法扩展Input类,将 
function _clean_input_keys($str) {if ( ! preg_match("/^[a-z0-9:_/-]+$/i", $str)) {exit('Disallowed Key Characters.');}return $str;}
改成:
function _clean_input_keys($str) {$config = &get_config('config');if ( ! preg_match("/^[".$config['permitted_uri_chars']."]+$/i", urlencode($str))) {exit('Disallowed Key Characters.');}return $str;}
扩展Uri类,将

function _filter_uri($str) {if ($str != '' AND $this->config->item('permitted_uri_chars') != '') {if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str)) {exit('The URI you submitted has disallowed characters.');}}return $str;}
改为:
function _filter_uri($str) {if ($str != '' AND $this->config->item('permitted_uri_chars') != '') {if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", urlencode($str))) {exit('The URI you submitted has disallowed characters.');}}return $str;}

摘自:

http://www.teamwiki.cn/php/codeigniter/ci_uri%E4%BC%A0%E9%80%92%E4%B8%AD%E6%96%87%E9%97%AE%E9%A2%98


原创粉丝点击