CodeIgniter URI中的百分号符号

5

我需要将一个编码后的字符串传递给CodeIgniter控制器。

例子:

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

我的问题是百分号被认为是一种不允许的字符。我尝试通过以下方式更改配置文件:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\+\%';
< p >这个< code >+是可以的,但< code >%是无效的。你能帮我修改一下正则表达式,使其允许< code >%符号吗?谢谢!< /p >
2个回答

26
将“ - ”放在字符串末尾,否则它会被解释为范围。 正如你所看到的那样,“%”已经包含在允许使用的字符列表中。
$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 中的禁止字符。这是通过白名单允许的字符来实现的。可以在 /system/application/config/config.php 中的 $config['permitted_uri_chars'] 变量中检查哪些字符被允许。默认值设置为类似于 '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) CodeIgniter 在白名单字符检查之前对 URI 段进行url解码,以防止某些人通过简单地对 URI 进行 url 编码来规避检查。因此,+被解码为一个空格。这种行为是由于urlencode(将空格编码为+符号,与RFC 1738有所偏差)。这就解释了为什么允许使用+符号。

这两个原因结合起来也可以解释为什么这个特定的 URI 不起作用。

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

糟糕... url解码将 %26 转换为一个 &

这不是一个允许的字符。神秘地解决了 ;-)


谢谢您的建议,但这并没有解决我的问题 :( 我仍然收到“您提交的URI包含不允许的字符”的错误提示。我按照您的建议更改了代码行,现在它可以正常工作,但是当我在URL中输入%时,它会出错。我尝试的示例是相同的: DO_SOMETHING/Coldplay/Fix+You/273/X+%26+Y/如果我删除%符号,它就可以完美运行... - RaduM
1
改进的回答。第一次忽略了与您的URI相关的问题。 - jitter
该死的URLDECODE,我已经查看了URI.php中的代码,但是xss清理还起作用,所以我错过了它。谢谢,现在一切都完美了。 - RaduM
抖动,那是一个非常棒的答案。阐述清晰,研究充分,感谢您花时间去做这件事。 - Alex Mcp

0
尝试这个: $config['uri_protocol'] = "PATH_INFO";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接