用户
 找回密码
 入住 CI 中国社区
搜索
12
返回列表 发新帖
楼主: bbiao
收起左侧

[修补 Patch] [1.6.0]CodeIgniter中URL含有中文字符串的解决方案

[复制链接]
发表于 2009-11-21 15:59:31 | 显示全部楼层
我不赞同这种解决方式
任何字符包括危险字符经过urlencode之后检测都会成为合法字符
那这样permitted_uri_chars 还有什么意义呢?和设置为''一样了。
发表于 2009-11-24 10:49:09 | 显示全部楼层
如果采用
$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之后,都会变成%+两位十六进制数这种类型.
只会有 [a-zA-Z\+\%] 这种形式. 此时  preg_match 永远都为OK,启用正则过滤形同虚设.
发表于 2009-11-24 14:50:24 | 显示全部楼层
注意:$config['permitted_uri_chars'] = '-a-z 0-9~%.:_';
('-'移到最前面,否则转义后它还是会被当作区间符.)
可以这样修改一下即可
PHP复制代码
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;
               
        }
}
复制代码
发表于 2009-11-24 14:51:17 | 显示全部楼层
不知道这种方法是否完美,请Hex测试一下.
发表于 2009-11-24 18:29:54 | 显示全部楼层
回复 14# lovelvaly


中文和英文区别对待,不错!
发表于 2009-11-30 13:32:31 | 显示全部楼层
我的没有使用这个方法,直接使用如下网址:


http://localhost/codeig/index.php/blog/comments/1/南京dfsdf=++

一点问题都没有呀
发表于 2011-4-2 15:16:41 | 显示全部楼层
好思路 顶下
发表于 2013-8-6 20:38:39 | 显示全部楼层
本地没问题,但传到服务器url参数乱码,请问该怎么解决呢??

本版积分规则