Codeigniter即使已经进行了URL编码,仍然“捕获”URL字符

3
我在使用Codeigniter时遇到了一个奇怪的问题。我的网站有一个搜索功能,它会将用户的查询显示在URL中,以便他们可以保存该URL。我确保在将查询文本放入URL之前,对其进行了rawurlencode处理。然而,当查询中有一个不在我的permitted_uri_characters配置中的字符时,Codeigniter仍然会将我重定向到错误页面。
所以,即使我的浏览器显示/search-results/query/%22samplequery%22,我仍然会收到关于使用非允许字符的错误。
这是一个Bug吗?我的URL中没有非允许字符。我有一个百分号和一些数字(这些都是明确允许的)。肯定是permitted_uri_characters设置给我带来了麻烦。如果我将引号添加到其中,它就可以轻松地通过%22查询。
需要说明的是,查询来自表单作为post数据,然后在我的控制器中进行编码,然后重定向到新页面。在进行编码之前,绝不可能在permitted_uri_characters被应用。
这让我非常困扰,因为目前我的唯一解决方案是打开我的permitted_uri_charcters以接受任何东西,这并不安全!

天啊...因为这个问题我现在非常讨厌Codeigniter。Neomech,你有没有找到答案的好运? - MikeMurko
3个回答

1

看起来你需要将@添加到permitted_uri_chars中,即使在将电子邮件urlencode之前发送到site_url()。在查找字符之前可能需要进行urldecode处理... 在CodeIgniter URI中使用百分比符号

这里是一个更具体的帖子,专门针对你的问题。 http://sholsinger.com/archive/2009/04/passing-email-addresses-in-urls-with-codeigniter/

我尝试了permitted_uri_chars,最终将电子邮件作为查询字符串传递(?email=bla@bla.com),甚至不进行urlencoding。效果很好 :)


0

我有自己的解决方案,虽然有点混乱且不是最优的,但它能够工作。你可以创建一个表格来存储(搜索字符串,URL标题)。

每次进行搜索时,保存字符串,生成一个url_title()并将其保存到数据库中。这样,您就可以将用户重定向到安全的URL,而不会错过最初的搜索。

我知道有人会因为这个解决方案而大喊大叫。但是,如果您的网站很小,流量很低,那么这是一个有效的解决方案。


0

可能是URL将%20编码为",然后CodeIgniter在验证时出现了问题?那我们将其添加到允许的字符列表中怎么样?


数字和%符号是允许的,而且我已经知道如果将引号添加到允许字符列表中,就可以使它正常工作。我的问题是,我不想添加引号到允许字符列表中,因为我不应该这样做,而且我正在尽可能保持安全性。 - neomech

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