2011-05-31 98 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