在Codeigniter中加密uri段

时间:2011-05-31 11:06:37

标签: url codeigniter security codeigniter-url

我想加密我作为ID传递的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

在某些网址上它会按预期工作,但在某些网址上会出现浏览器错误404(找不到对象)。在删除加密段时,我可以访问索引功能。可能的原因是什么?

2 个答案:

答案 0 :(得分:4)

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

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

在某些项目中,我也改变了这一点:

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

但是,正如CodeIgniter Engineers所述

  

除非您完全了解回复,否则请勿更改!!

答案 1 :(得分:2)

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

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


更新

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

解决此问题:

  • 您可以使用其他加密算法。你知道的不会添加时髦的角色。
  • 您可以使用Base64对结果进行编码。 Base64 不应该返回除字母数字字符以外的任何内容(如果我没记错的话, )。但请注意,它可以使结果更大
  • NOT RECCOMENDED )您可以在CI配置的xss过滤部分中编辑“允许的字符”。