任何字符包括危险字符经过urlencode之后检测都会成为合法字符
那这样permitted_uri_chars 还有什么意义呢?和设置为''一样了。 如果采用
$str = urlencode($str);
if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
{
exit('The URI you submitted has disallowed characters.');
}
$str = urldecode($str);
这种方式来过滤,实际上再过滤 url 已经没有任何意义了.因为所有字符经urlencode之后,都会变成%+两位十六进制数这种类型.
只会有 这种形式. 此时preg_match 永远都为OK,启用正则过滤形同虚设. 注意:$config['permitted_uri_chars'] = '-a-z 0-9~%.:_';
('-'移到最前面,否则转义后它还是会被当作区间符.)
可以这样修改一下即可
class MY_URI extends CI_URI
{
function _filter_uri($str)
{
//utf-8 chinese character:
$pagecode = ($this->config->item('charset'))? $this->config->item('charset') : 'ANSI';
if( $pagecode == 'UTF-8' ){
$charcters = "\x{4e00}-\x{9fa5}";
$pattern = '/^['.preg_quote($this->config->item('permitted_uri_chars')).$charcters."]+$/ui";
}
else{
$charcters ='['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']';
$pattern = '/^['.preg_quote($this->config->item('permitted_uri_chars')).']|'.$charcters."+$/i";
}
if ($str != '' AND $this->config->item('permitted_uri_chars') != '')
{
if ( ! preg_match($pattern, $str))
{
exit('The URI you submitted has disallowed characters.');
}
}
return $str;
}
} 不知道这种方法是否完美,请Hex测试一下.:handshake 回复 14# lovelvaly
中文和英文区别对待,不错! 我的没有使用这个方法,直接使用如下网址:
http://localhost/codeig/index.php/blog/comments/1/南京dfsdf=++
一点问题都没有呀 好思路 顶下 本地没问题,但传到服务器url参数乱码,请问该怎么解决呢??:L
页:
1
[2]