在Codeigniter中,我使用POST方法發送一個字符串作爲"%100"
,它變成"0"
。我相信這是因爲他們被視爲編碼,但他們不是。在Codeigniter中替換的字符百分比
反正有沒有取消,同時仍然保持安全性很高,因爲這似乎是由Security->xss_clean()
和Common remove_invisible_characters()
在Codeigniter中,我使用POST方法發送一個字符串作爲"%100"
,它變成"0"
。我相信這是因爲他們被視爲編碼,但他們不是。在Codeigniter中替換的字符百分比
反正有沒有取消,同時仍然保持安全性很高,因爲這似乎是由Security->xss_clean()
和Common remove_invisible_characters()
造成的,我相信這裏的問題是無關的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
。
嗨,我發現它實際上並不是關於我的HTTP請求,它已經被url編碼,而是關於Codeigniter的Security類,它調用'rawurldecode()'來獲取POST數據。你有任何想法將刪除'rawurldecode'導致系統中的任何安全漏洞? – kubilayeksioglu 2012-01-04 14:35:42
這也發生在我身上,我選擇在這種情況下通過雙重編碼變得懶惰。現在,當CI試圖以單編碼方式結束時,它就是我想要的。 – clockworkgeek 2012-07-13 14:39:09
您可以創建自己的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);
}
}
?>
這將編碼值,這樣,當它是由父解碼功能,您將有您所提交的原始值。
只需查找由函數CI_Input :: _ sanitize_globals()調用的CodeIgniter system/core/Common.php中定義的remove_invisible_characters()函數即可。它負責清理以「%」開頭的某些轉義序列。我更喜歡重寫輸入類以禁用全局變量的自動清理。
在你的'/ application/config/config.php'中是$ config ['global_xss_filtering']'設置爲'TRUE'或'FALSE'?如果它設置爲「TRUE」,並且您再次使用「xss_clean」,那麼這可能是對輸入進行雙重編碼的原因。 – stealthyninja 2012-01-04 16:54:09