2009-06-20 144 views
4

我需要将编码字符串传递给CodeIgniter控制器。CodeIgniter URI中的百分比符号

DOSOMETHING/Coldplay/Fix+You/273/X+%26+Y/ 

我的问题是百分号是不允许的字符。我试图更改配置文件,如下:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\+\%'; 

+是好的,但%无效。你能帮我改变这个reg exp,所以它会允许%这个符号吗?提前致谢!

回答

25

将“-”放在字符串的末尾,否则将被解释为范围。你可以看到%已经在允许的字符列表中。

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+-'; 

恩...你的样本串再次照看。这就是为什么你会得到“The URI you submitted has disallowed characters”。

简短说明:添加符号&到允许的字符列出

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+&-'; 

龙解释

有两件事情一起玩。

A) CodeIgniter检查所有的URI 为不允许的字符。这通过将允许的字符列入白名单来实现。可以在$config['permitted_uri_chars']变量中的/ system/application/config/config.php中检查哪些被允许。默认值设置为'a-z 0-9~%.:_-'。因此,允许从a到z,空格,所有数字和以下字符*〜%。:_-的所有字母。

好吧,让我们比较,为您的样本URI,你说的作品

a-z 0-9~%.:_- 
DO_SOMETHING/Coldplay/Fix+You/273/X+26+Y/ //note the missing % 

所有的人物都是好的......但等待什么的加号+?它不在允许的字符列表中!然而这个URI没有被抱怨?这是你的问题的关键。

B)笨之前的白名单字符检查以防止有人通过简单URL编码的URI绕过单向urldecodes的URI段。因此,+被解码到一个空间。此行为是由于urlencode(其编码空间为+符号,偏离RFC 1738)。这就解释了为什么允许使用+符号。

这两件事合起来解释了为什么这个特定的URI不起作用。

urldecode(DO_SOMETHING/Coldplay/Fix+You/273/X+%26+Y/) //evaluates to 
//DO_SOMETHING/Coldplay/Fix You/273/X & Y/ 

哎呦...的urldecoding转换%26&

这是不是允许的字符。 Mistery ;-)解决

+0

感谢您的输入,但这并没有解决我的问题:( 我仍然得到URI您提交已禁用的字符。 我改了行,你sugested和它工作正常,但是当我在输入% URL它打破 我尝试相同的例子: DO_SOMETHING /酷玩/修复+你/ 273/X +%26 + Y/ 如果我删除%完美的作品... – RaduM 2009-06-20 20:11:43

+1

增强的答案被忽视的问题。特定于您的URI第一次 – jitter 2009-06-20 21:14:57

+0

:)上帝该死的URLDECODE,我看过URI.php中的代码,但是xss clean正在完成这项工作,所以我错过了它。 谢谢你,现在一切都很完美。 – RaduM 2009-06-21 10:25:25

0

试试这个: $ config ['uri_protocol'] =“PATH_INFO”;