如果我尝试访问此网址http://localhost/common/news/33/+%E0%B0%95%E0%B1%87%E0%B0%B8.html,则会显示“遇到错误”,您提交的URI已禁止使用该字符。我设置$ config ['allowed_uri_chars'] ='a-z 0-9~%。:?? _ = + - ?' ; ..//我做什么?
答案 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不会接受网址中的某些字符,我不想更改它。所以这就是我所做的:
我知道要问这个问题差不多一年了,但是我希望有人会在谷歌来这里之后找到这个解决方案。