比如下面的路径: http://www.example.com/search/name/中文字符,但是一直报错:Disallowed Key Characters.之前一直以为是system/library/URI.php的问题。不断的去修改系统的
总结: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类,将
$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