2010-11-04 138 views
2

如果我試圖訪問此URL http://localhost/common/news/33/+%E0%B0%95%E0%B1%87%E0%B0%B8.html,它顯示An An Error Was Encountered,您提交的URI不允許使用字符。我設置了$ config ['permitted_uri_chars'] ='a-z 0-9〜%。:?? _ = + - ?' ; ..// 我做的事 ?codeigniter不允許使用字符錯誤

+0

CodeIgniter會不會聰明地知道'%E0'是它自己的字符,超出了範圍?我知道如果我要指定什麼字符可以在一個URL(一個相當愚蠢的做法海事組織,但呃),我會先解碼它之前檢查他們。 – cHao 2010-11-04 17:14:56

+0

爲什麼你有三次問號?我同意@cHao 100%。 – treeface 2010-11-04 17:15:58

回答

1

怎麼辦? 停止在URL中使用unicode字符 - 出於同樣的原因,您不應使用unicode字符在文件系統上命名文件。

但是,如果你真的需要它,我會複製/粘貼從配置一些行:

Leave blank to allow all characters -- but only if you are insane. 
+3

在URL路徑中包含(UTF-8編碼的)Unicode字符是完全有效的並且通常是可取的(參見例如維基百科的漂亮的URL)。如果CodeIgniter無法處理,它似乎是一個令人失望的缺點。 (爲什麼我不應該在文件系統上使用Unicode文件名?我有許多帶有各種重音和非拉丁字母字符的文件,例如書籍和歌曲標題,我不想用這些文件來適應基本的ASCII。) – bobince 2010-11-05 21:12:05

+1

CodeIgniter可以做到這一點! – sepehr 2012-09-27 01:15:15

3

是的,如果你要允許非ASCII字節你就必須將它們添加到permitted_uri_chars 。該功能可以在URL解碼的字符串上運行(通常情況下,除非環境中有特殊情況),因此您必須將字符串中的逐字節放在字符串中,而不僅僅是%和十六進制數字。 (是的,我說字節:_filter_uri不使用Unicode正則表達式,所以你不能使用Unicode範圍。)

試圖篩選傳入的值(而不是編碼傳出的值)是一個可笑的基本錯誤,它是令人沮喪在流行的框架中找到。您可以通過將permitted_uri_chars設置爲空字符串來關閉此錯誤導入的功能,或者您可能希望除控制代碼("\x20-\xFF")以外的所有字節範圍。不幸的是,_filter_uri功能仍然瘋狂,瘋狂,破壞了一些輸入的東西,在一些未知的離奇原因的途中用HTML編碼了一些標點符號。你不會把它關掉。

這與破損的「反XSS」磨碎機一起,使我相信CodeIgniter團隊對字符串轉義和安全問題的實際工作方式有相當的瞭解。我不會相信他們在安全方面所說的任何話。

1

我不會建議嘗試解碼它們或使用任何其他技巧,而不是我會建議使用urlencode()urldecode()函數。

由於我沒有你的代碼的副本,我不能添加例子,如果你可以給我一些例子,我可以告訴你一個例子如何做到這一點。

但是,它的使用非常簡單,它使用PHP4和PHP5構建。

1

我有類似的問題,並希望分享解決方案。這是重置密碼,我不得不發送用戶名和時間,因爲URL只會在一小時內激活。由於安全原因,Codeigniter不會接受URL中的某些字符,我不想改變它。因此,這裏是我做過什麼:

  • CONCAT用戶名, '__',並在變量$ STR時間()使用MCRYPT_BLOWFISH
  • 加密$海峽,這可能包含 '/', '+'
  • 重新加密使用str2hex(從here得到它)
  • 把編碼字符串中的鏈接通過電子郵件 發送,像第三個參數, http://xyz.com/users/resetpassword/3123213213ABCDEF238746238469898 - 你可以看到,該網址只包含0-9和AZ。
  • 點擊郵件鏈接後,得到第3個uri段,使用 hex2str()解密爲blowfish加密字符串,然後應用 blowfish解密得到原始字符串。
  • 分裂與「__」,以獲取用戶名和時間

我知道了將近一年,直到這個問題被問過,但我希望有人會發現這個解決方案有幫助來到這裏由谷歌後。

相關問題