已经有一些关于不允许的关键字符的帖子,但是这个问题有不同的问题。我想知道如果我将$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规则?
答案 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。这是我发现的:
在CodeIgniter中,网址的permitted_uri_chars
部分是网址编码的(例如controller/method
转换为ـج
)。如果您想在%D9%80%D8%AC%E2%80%8E
或controller
名称中使用阿拉伯语,您有两种选择:
method
添加url编码的路由指向可能包含阿拉伯字符的实际路由(如上所述,您可以在PHP标识符中使用UTF-8字符)。例如:application/config/routes.php
将允许用户转到$route['welcome/%D8%A3'] = 'welcome/أ';
,example.com/index.php/welcome/أ
将在أ
控制器中调用function أ() { ... }
方法(定义为welcome
)。当然,您可以将阿拉伯语网址编码的网址映射到普通的ASCII名称。 Extend system/core/Router.php
类,以便fetch_method
和fetch_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'
则:
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\x{0600}-\x{06FF}';
在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))