codeigniter禁止字符错误

时间:2010-11-04 17:11:58

标签: php codeigniter

如果我尝试访问此网址http://localhost/common/news/33/+%E0%B0%95%E0%B1%87%E0%B0%B8.html,则会显示“遇到错误”,您提交的URI已禁止使用该字符。我设置$ config ['allowed_uri_chars'] ='a-z 0-9~%。:?? _ = + - ?' ; ..//我做什么?

4 个答案:

答案 0 :(得分:3)

是的,如果你想允许非ASCII字节,你必须将它们添加到permitted_uri_chars。此功能对URL解码的字符串进行操作(通常,除非环境有异常),因此您必须将所需的逐字节字节放在字符串中,而不仅仅是%和十六进制数字。 (是的,我说过字节:_filter_uri不使用Unicode正则表达式,所以你不能使用Unicode范围。)

尝试过滤传入的值(而不是编码传出的值)是一个荒谬的基本错误,它在流行的框架中令人沮丧。您可以通过将permitted_uri_chars设置为空字符串来关闭此误导功能,或者您可能希望除控制代码("\x20-\xFF")之外的所有字节范围。不幸的是,_filter_uri函数仍然使用一些输入做了疯狂,疯狂,破碎的事情,HTML编码了一些标点符号,因为某些未知的奇怪原因。你不能把它关掉。

这与破碎的“反XSS”管理器一起使我相信CodeIgniter团队对字符串转义和安全问题的实际工作方式了解甚少。我不相信他们对安全的任何看法。

答案 1 :(得分:1)

怎么办? 停止在URL中使用unicode字符 - 原因与您不应在具有unicode字符的文件系统上命名文件的原因相同。

但是,如果你真的需要它,我会从配置中复制/粘贴一些行:

Leave blank to allow all characters -- but only if you are insane.

答案 2 :(得分:1)

我不建议尝试解码或使用任何其他技巧,而是建议使用urlencode()urldecode()函数。

由于我没有您的代码副本,我无法添加示例,如果您可以提供一些示例,我可以向您展示如何执行此操作。

但是,它使用非常简单,并且它是用PHP4和PHP5构建的。

答案 3 :(得分:1)

我有类似的问题,想分享解决方案。这是重置密码,我必须发送用户名和时间,因为网址只会活动一个小时。出于安全原因,Codeigniter不会接受网址中的某些字符,我不想更改它。所以这就是我所做的:

  • 在var $ str
  • 中使用concat用户名,'__'和time()
  • 使用MCRYPT_BLOWFISH加密$ str,这可能包含'/','+'
  • 使用str2hex重新加密(从here获得)
  • 将编码后的字符串作为第3个参数发送到 电子邮件,像, http://xyz.com/users/resetpassword/3123213213ABCDEF238746238469898 - 你可以看到网址只包含0-9和A-Z。
  • 点击电子邮件链接后,获取第3个uri细分,使用 hex2str()解密为blowfish加密的字符串,然后应用 blowfish解密得到原始字符串。
  • 用'__'拆分以获取用户名和时间

我知道要问这个问题差不多一年了,但是我希望有人会在谷歌来这里之后找到这个解决方案。