2009-06-20 142 views
4

我需要將編碼字符串傳遞給CodeIgniter控制器。CodeIgniter URI中的百分比符號

DOSOMETHING/Coldplay/Fix+You/273/X+%26+Y/ 

我的問題是百分號是不允許的字符。我試圖更改配置文件,如下:

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

+是好的,但%無效。你能幫我改變這個reg exp,所以它會允許%這個符號嗎?提前致謝!

回答

25

將「-」放在字符串的末尾,否則將被解釋爲範圍。你可以看到%已經在允許的字符列表中。

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

恩...你的樣本串再次照看。這就是爲什麼你會得到「The URI you submitted has disallowed characters」。

簡短說明:添加符號&到允許的字符列出

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

龍解釋

有兩件事情一起玩。

A) CodeIgniter檢查所有的URI 爲不允許的字符。這通過將允許的字符列入白名單來實現。可以在$config['permitted_uri_chars']變量中的/ system/application/config/config.php中檢查哪些被允許。默認值設置爲'a-z 0-9~%.:_-'。因此,允許從a到z,空格,所有數字和以下字符*〜%。:_-的所有字母。

好吧,讓我們比較,爲您的樣本URI,你說的作品

a-z 0-9~%.:_- 
DO_SOMETHING/Coldplay/Fix+You/273/X+26+Y/ //note the missing % 

所有的人物都是好的......但等待什麼的加號+?它不在允許的字符列表中!然而這個URI沒有被抱怨?這是你的問題的關鍵。

B)笨之前的白名單字符檢查以防止有人通過簡單URL編碼的URI繞過單向urldecodes的URI段。因此,+被解碼到一個空間。此行爲是由於urlencode(其編碼空間爲+符號,偏離RFC 1738)。這就解釋了爲什麼允許使用+符號。

這兩件事合起來解釋了爲什麼這個特定的URI不起作用。

urldecode(DO_SOMETHING/Coldplay/Fix+You/273/X+%26+Y/) //evaluates to 
//DO_SOMETHING/Coldplay/Fix You/273/X & Y/ 

哎呦...的urldecoding轉換%26&

這是不是允許的字符。 Mistery ;-)解決

+0

感謝您的輸入,但這並沒有解決我的問題:( 我仍然得到URI您提交已禁用的字符。 我改了行,你sugested和它工作正常,但是當我在輸入% URL它打破 我嘗試相同的例子: DO_SOMETHING /酷玩/修復+你/ 273/X +%26 + Y/ 如果我刪除%完美的作品... – RaduM 2009-06-20 20:11:43

+1

增強的答案被忽視的問題。特定於您的URI第一次 – jitter 2009-06-20 21:14:57

+0

:)上帝該死的URLDECODE,我看過URI.php中的代碼,但是xss clean正在完成這項工作,所以我錯過了它。 謝謝你,現在一切都很完美。 – RaduM 2009-06-21 10:25:25

0

試試這個: $ config ['uri_protocol'] =「PATH_INFO」;