CI离开CodeIgniter不允许的键字符是空的有多大的风险?

时间:2013-03-20 10:03:50

标签: php codeigniter

已经有一些关于不允许的关键字符的帖子,但是这个问题有不同的问题。我想知道如果我将$config['permitted_uri_chars']留空是多么冒险。怎么会发生什么? 原因?我需要enable_query_strings FALSE,我在

中使用阿拉伯语单词

URL:

www.mydomain.com/%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B7%D8%A9-%D8%A7%D9%84%D9%8A%D9%88%D9%86%D8%A7%D9%86%D9%8A`

我从不依赖URL的价值,我总是先做一些清洁工作。但我不确定Codeigniter如何处理路由以及它如何包含文件。他们是否依赖这一单一的allowed_uri_chars规则?

1 个答案:

答案 0 :(得分:2)

如果您只想包含阿拉伯字符,可以在premitted_uri_chars regexp中包含unicode范围。使用this wikipedia site我们可以尝试构建regexp:

a-z 0-9~%.:_\- \x0600-\x06FF

不幸的是,对于我们的案例,CodeIgniter不使用u中的preg_match修饰符(用于unicode)。因此,为了使其工作,您需要修改源代码文件system/core/URI.php, line 257行,并将其更改为:

if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|iu", $str))

在上面的代码中,我只将u修饰符添加到preg_match。或者,您可以在documentation中扩展URI类,这是更好的选择。

(我没有测试过这个)

回答为什么允许所有字符不好的问题:我只能想到SQL注入问题或other kinds of injections

编辑:例如,如果您使用网址index.php/main/get_pdf?filename=awesome.pdf./pdf/awesome.pdf下载pdf文件,如果您没有正确处理(即验证)您的输入,则恶意用户可以执行以下操作:{{1 }};)。

Edit2:嗯,上面的示例不是index.php/main/get_pdf?filename=../secure_files/nuclear_launch_codes.pdf使用不当的一个例子,因为AFAIK CodeIgniter允许这种url变量,所以你需要验证这个东西你自己。我回家后会检查所有这些东西。

Edit3:我修复了regexp,但似乎这不是启用阿拉伯字符的方法,所以我划掉了答案的这一部分。

我和CodeIgniter玩了一会儿。我不知道这些东西是否适用于其他系统。它适用于我的Windows XP,PHP 5.3。这是我发现的:

  • 在PHP中,您可以使用UTF-8字符作为函数和类标识符,但它不受官方支持(有关详细信息,请参阅this)。
  • 在CodeIgniter中,网址的permitted_uri_chars部分是网址编码的(例如controller/method转换为ـج‎‎)。如果您想在%D9%80%D8%AC%E2%80%8Econtroller名称中使用阿拉伯语,您有两种选择:

    1. method添加url编码的路由指向可能包含阿拉伯字符的实际路由(如上所述,您可以在PHP标识符中使用UTF-8字符)。例如:application/config/routes.php将允许用户转到$route['welcome/%D8%A3'] = 'welcome/أ';example.com/index.php/welcome/أ将在أ控制器中调用function أ() { ... }方法(定义为welcome)。当然,您可以将阿拉伯语网址编码的网址映射到普通的ASCII名称。
    2. Extend system/core/Router.php类,以便fetch_methodfetch_class返回已解码的url名称。我不知道你这样做时的安全隐患。可能最好验证输入字符是否确实是阿拉伯语(即您可以检查提供的字符范围here)。修改后的fetch_class示例:

      function fetch_class()
      {
          return urldecode($this->class);
      }
      
  • 如果您需要在控制器方法的参数中使用阿拉伯字符,您只需要urldecode这些参数。 E.g:

    class Welcome extends CI_Controller
    {
        public function index($param)
        {
            $this->output->set_content_type("text/plain; charset=utf-8");
            echo urldecode($param);
        }
    }
    
  • 如果您需要在查询字符串中使用这些字符,它就可以正常工作。 E.g。

    class Welcome extends CI_Controller
    {
        public function index()
        {
            $this->output->set_content_type("text/plain; charset=utf-8");
            echo $this->input->get('arabic');
        }
    }
    

    转到example.com/index.php/welcome/index?arabic=ابتثجحخدذرزسشصضطظعغفقكلمنهوي将打印出ابتثجحخدذرزسشصضطظعغفقكلمنهوي

Edit4:如果您有$config['uri_protocol'] = 'PATH_INFO'则:

  1. 在配置集$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\x{0600}-\x{06FF}';
  2. URI中扩展system/core/URI.php课程,以便在方法_filter_uri中与preg_match对齐:

    if ( ! preg_match("|^[".str_replace(array('\\-', '\-', '\{', '\}', '\\\\x'), array('-', '-', '{', '}', '\x'), preg_quote($this->config->item('permitted_uri_chars')))."]+$|ui", $str))