Fanbin 发表于 2009-11-21 15:59:31

我不赞同这种解决方式
任何字符包括危险字符经过urlencode之后检测都会成为合法字符
那这样permitted_uri_chars 还有什么意义呢?和设置为''一样了。

lovelvaly 发表于 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之后,都会变成%+两位十六进制数这种类型.
只会有 这种形式. 此时preg_match 永远都为OK,启用正则过滤形同虚设.

lovelvaly 发表于 2009-11-24 14:50:24

注意:$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;
               
        }
}

lovelvaly 发表于 2009-11-24 14:51:17

不知道这种方法是否完美,请Hex测试一下.:handshake

Hex 发表于 2009-11-24 18:29:54

回复 14# lovelvaly


中文和英文区别对待,不错!

20072008 发表于 2009-11-30 13:32:31

我的没有使用这个方法,直接使用如下网址:


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

一点问题都没有呀

vsda2008 发表于 2011-4-2 15:16:41

好思路 顶下

、林神奇 发表于 2013-8-6 20:38:39

本地没问题,但传到服务器url参数乱码,请问该怎么解决呢??:L
页: 1 [2]
查看完整版本: [1.6.0]CodeIgniter中URL含有中文字符串的解决方案