用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5605|回复: 6
收起左侧

[安全] Router & URI 的中文字支援處理

[复制链接]
发表于 2011-1-18 22:19:07 | 显示全部楼层 |阅读模式
因為 Codeigniter 預設的 Filter 能處理字串保持網址安全。
不過我又希望能夠傳入中文字串。

所以用了下面的處理方法。
不知道這樣是否安全……
(台灣的中文論壇討論不怎麼熱烈,上中國的開發者社區……)

MY_Router.php
PHP复制代码
 
<?php if( ! defined('BASEPATH') ) exit('No direct script access allowed');
 
/*
*       Codeigniter Router Extend
*       @package CI-Dev
*       @author 蒼時弦や
*/

 
class MY_Router extends CI_Router
{
        static private $pages;
       
        function __construct()
        {
                parent::CI_Router();
        }
       
 
        function _validate_request($segments)
        {
                // Does the requested controller exist in the root folder?
                if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
                {
                        return $segments;
                }
 
                // Is the controller in a sub-folder?
                if (is_dir(APPPATH.'controllers/'.$segments[0]))
                {              
                        // Set the directory and remove it from the segment array
                        $this->set_directory($segments[0]);
                        $segments = array_slice($segments, 1);
                       
                        if (count($segments) > 0)
                        {
                                // Does the requested controller exist in the sub-folder?
                                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
                                {
                                        show_404($this->fetch_directory().$segments[0]);
                                }
                        }
                        else
                        {
                                $this->set_class($this->default_controller);
                                $this->set_method('index');
                       
                                // Does the default controller exist in the sub-folder?
                                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
                                {
                                        $this->directory = '';
                                        return array();
                                }
                       
                        }
 
                        return $segments;
                }
 
                // Can't find the requested controller...
                //Routing to Manager
                if($segments[0] == 'index')
                        return array('manager', 'index', array_slice($segments, 1));
                else
                        return array('manager', 'index', $segments);
        }
       
}
 
复制代码


其實也就只是在找不到時轉到 manager 這個 Controller 去控管。
(參考之前的貼子改良的)

MY_URI.php
PHP复制代码
 
<?php if( ! defined('BASEPATH') ) exit('No direct script access allowed');
 
/*
*       Codeigniter URI Extend
*       @package CI-Dev
*       @author 蒼時弦や
*/

 
class MY_URI extends CI_URI
{
       
        function __construct()
        {
                parent::CI_URI();      
        }
       
        /**
        *
        *       Filter URI (Chinese Support)
        *
        *       @access private
        *       @prama string
        *       @return string
        */

        function _filter_uri($str)
        {
                if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
                {
                        // preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
                        // compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
                        if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))
                        {
                                //show_error('The URI you submitted has disallowed characters.', 400);
                                //Urlencode Fix
                                $str = urlencode($str);
                                return array(1, $str);
                        }
                }
 
                // Convert programatic characters to entities
                $bad    = array('$',            '(',            ')',            '%28',          '%29');
                $good   = array('&#36;',        '&#40;',        '&#41;',        '&#40;',        '&#41;');
 
                return str_replace($bad, $good, $str); 
        }
       
        /**
         * Explode the URI Segments. The individual segments will
         * be stored in the $this->segments array.
         * Fix for Chinese (change to prama)
         *
         * @access      private
         * @return      void
         */

        function _explode_segments()
        {
                foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $key => $val)
                {
                        // Filter segments for security
                        $val = $this->_filter_uri($val);
 
                        if ($val != '' && !is_array($val))
                        {
                                $this->segments[] = trim($val);
                        }else{
                                if($key >= 2)
                                        $this->segments[] = $val[1];
                                else{
                                        $this->segments[] = 'index';
                                        $this->segments[] = $val[1];
                                }
                        }
                }
        }
}
 
复制代码


因為 URI 比 Router 被 Load, 所以不能在 Load 上另外處理。
(在Router做_filter_uri之前會先做一次確保網址安全。)

進行分段的時候檢查是否被urlencode過,如果是則會強制推到傳入的值。
(避開Controller和Method)

不過 deurlencode 之後的事就不知道是不是安全了……
(雖然只是要弄類似 slug 那樣查詢,不會去 deurlencode ...)
发表于 2011-1-19 16:28:30 | 显示全部楼层
因為 Codeigniter 預設的 Filter 能處理字串保持網址安全。
不過我又希望能夠傳入中文字串。

所以用了下面 ...
elct9620 发表于 2011-1-18 22:19



该留言已被Saturn删除,有意见请到指定版面投诉,感谢支持。

评分

参与人数 1威望 -1 收起 理由
saturn -1 不要进行除技术之外的。特别是政治,谢谢合 ...

查看全部评分

发表于 2011-1-19 16:34:41 | 显示全部楼层
再來回答下你的問題吧

我感覺你傳中文的controller/action沒什麽意義。因為各個瀏覽器不同,有些瀏覽器你傳中文轉碼會丟失的,例如IE,firefox下你傳編碼過的和沒編碼的是一樣的。我這個意思就是你傳中文在有些瀏覽器下容易出錯。

再就是搜索引擎,一般會把編碼后的解碼來收錄,就是還是收錄你的中文字體。
 楼主| 发表于 2011-1-19 18:09:49 | 显示全部楼层
再來回答下你的問題吧

我感覺你傳中文的controller/action沒什麽意義。因為各個瀏覽器不同,有些瀏覽器你 ...
bluelomo 发表于 2011-1-19 16:34


我就是為了讓他收錄中文字才這樣處理的……

因為我的 Project 得自動產生數個頁面。
不過這時碰上頁面設定為中文時,我擔心沒辦法顯示。
Google自動音譯又不知道怎麼弄的,只好這樣處理。

不過我比較好奇的是做過 urlencode 處理後的字串是否安全,和各瀏覽器是否正常支援。
发表于 2011-4-7 22:33:50 | 显示全部楼层
不支持就自动用上urlencode的。我试过。
发表于 2011-4-22 11:38:22 | 显示全部楼层
何必搞那么麻烦呢 你直接让Apache2支持中文URL就可以了么  自己搜索下如何配置。
发表于 2011-4-22 11:42:07 | 显示全部楼层
回复 6# litaobbs


   不是所有人都会弄你哪个东东,支持楼主~~

本版积分规则