2011-05-31 40 views
2

我想加密作为ID传递的我的uri段以查询数据库表。在Codeigniter中加密uri段

比如我使用

$id=urlencode($this->encrypt->encode($user['id'])); 

这是使用

$id_decrypt=$this->encrypt->decode(urldecode($id)); 

我已经测试加密和能解密,它似乎另一个工作控制器上解码。然而,在尝试网址如。

http://localhost/app_name/index.php/profile/view_profile/b98N98YNqoEA7yI1tavIY1s51RhiSHKGCFarU4A6XgFUMB%2BI3KwiEA23h1XITmkq1qPABqGs8e1sdP16v4og8g%3D%3D 

对一些url会按预期的方式工作,但在一些它会给浏览器错误404(对象未找到)。在删除加密段时,我可以访问索引功能。这可能是什么原因?

回答

4

在文件./application/config/config.php中有一个允许的uri字符的部分。默认的字符为:

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

在一些项目中,我已经改变了这种太:

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

然而,随着笨工程师状态

不要更改,除非你完全理解回报!

2

我认为你遇到的问题是+符号。 %2B解码后变成+。 CI的URL路由器在解码的URL上运行。

+是用于表示空格的网址中的特殊字符。这可能会绊倒url路由器。


更新:

这实际上可能CI进行相关的XSS脚本保护。有一个接受的URL字符的列表,它检查输入。您正在使用的加密确实会在输入中输入很多有趣的字符。 (%3D=)。这些(包括+)可能是绊倒了。

要解决这个问题:

  • 您可以使用不同的加密算法。你知道的一个不会添加时髦的字符。
  • 您可以Base64对结果进行编码。 Base64 不应该返回除字母数字字符以外的其他任何东西(如果我没有记错的话。但是请注意,它可以使结果长度为较大
  • NOT RECCOMENDED)您可以在CI配置的xss过滤部分中编辑'允许的字符'。
+0

它似乎是真的,大多数网站无法正常工作有%2B。你有任何想法我可以删除它。除了+以外,还有其他角色我应该关注吗?因为一些网址没有%2B,但他们没有工作。 – serengeti12 2011-05-31 20:06:10

+0

@ serengeti12:我已经为你更新了我的答案 – Aren 2011-05-31 23:40:31

+0

我现在已经意识到,带来问题的是%2F,它是'/'。使用Base64encode可以删除其他字符,但会出现=,这似乎也显然与路由器有一些问题。 – serengeti12 2011-06-01 13:34:13