2012-01-04 38 views
3

在Codeigniter中,我使用POST方法發送一個字符串作爲"%100",它變成"0"。我相信這是因爲他們被視爲編碼,但他們不是。在Codeigniter中替換的字符百分比

反正有沒有取消,同時仍然保持安全性很高,因爲這似乎是由Security->xss_clean()Common remove_invisible_characters()

+0

在你的'/ application/config/config.php'中是$ config ['global_xss_filtering']'設置爲'TRUE'或'FALSE'?如果它設置爲「TRUE」,並且您再次使用「xss_clean」,那麼這可能是對輸入進行雙重編碼的原因。 – stealthyninja 2012-01-04 16:54:09

回答

1

造成的,我相信這裏的問題是無關的CI甚至PHP,但你的HTTP請求。

可以說,我做一個POST請求,看起來像這樣:

POST /path/to/file HTTP/1.1 
Host: server.com 
User-Agent: Bob the browser/1.0 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 25 

name=Dave&percentage=%100 

什麼你可能希望爲$_POST看起來像這樣:

Array 
    (
     [name] => Dave 
     [percentage] => %100 
    ) 

但是,實際上PHP會(正確),它爲這個解碼:

Array 
    (
     [name] => Dave 
     [percentage] => 0 
    ) 

這是因爲%10是一個有效的url編碼字符串,並且會被翻譯成不可打印的,在這種情況下無意義"Data Link Escape" character,ASCII 0x10

爲了得到你所期望的結果,要求必須是這樣的:

POST /path/to/file HTTP/1.1 
Host: server.com 
User-Agent: Bob the browser/1.0 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 27 

name=Dave&percentage=%25100 

所以你實際上是在POST體發送的值是%25100。這將被正確解碼爲%100

+1

嗨,我發現它實際上並不是關於我的HTTP請求,它已經被url編碼,而是關於Codeigniter的Security類,它調用'rawurldecode()'來獲取POST數據。你有任何想法將刪除'rawurldecode'導致系統中的任何安全漏洞? – kubilayeksioglu 2012-01-04 14:35:42

+0

這也發生在我身上,我選擇在這種情況下通過雙重編碼變得懶惰。現在,當CI試圖以單編碼方式結束時,它就是我想要的。 – clockworkgeek 2012-07-13 14:39:09

0

您可以創建自己的MY_Security類,而不用去除rawurldecode函數,然後使用它來覆蓋xss_clean函數。也許在調用父級父級xss_clean函數之前使用PHP的rawurlencode函數。事情是這樣的:

<?php 

class MY_Security extends Security { 

    function MY_Security() { 
     parent::Security(); 
    } 

    public function xss_clean($str, $is_image = FALSE) { 
     $str = rawurlencode($str); 
     return parent::xss_clean($str, $is_image); 
    } 

} 

?> 

這將編碼值,這樣,當它是由父解碼功能,您將有您所提交的原始值。

3

只需查找由函數CI_Input :: _ sanitize_globals()調用的CodeIgniter system/core/Common.php中定義的remove_invisible_characters()函數即可。它負責清理以「%」開頭的某些轉義序列。我更喜歡重寫輸入類以禁用全局變量的自動清理。