有极速快乐十分吗|极速快乐十分走势图|

CI自動過濾掉百分號%后兩位的問題解決

記錄這個問題解決的思維全過程
服務器君一共花費了162.733 ms進行了5次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

CodeIgniter 做的網站里,想輸入一段代碼:

$var = sprintf("%04d", 2);

但是發現入庫后,代碼變成了

$var = sprintf("d", 2);

在網上環境,本地環境都測試過,最終確認是 CodeIgniter 系統的問題。下面談一下問題解決的過程與思維方法:

1. 是 config.php 的 permitted_uri_chars 嗎?

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

在 stackoverflow 上找到幾個差不多的問題,有答案說改 config.php 的 permitted_uri_chars 就行了。

Ahem... after looking at your sample string again. Here is why you get "The URI you submitted has disallowed characters".

Short explanation: Add the ampersand?&?to the allowed characters list

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

試過了,沒效果,于是就查找應用了 $config['permitted_uri_chars'] 的代碼。

2. 是 core/Input.php 的 _clean_input_keys() 函數問題嗎?

	function _clean_input_keys($str)   
	{   
		$config = &get_config('config');   
		if ( ! preg_match("/^[".$config['permitted_uri_chars']."]+$/i", rawurlencode($str)))   
		{   
			exit('Disallowed Key Characters.');   
		}   
		
		// Clean UTF-8 if supported
		if (UTF8_ENABLED === TRUE)
		{
			$str = $this->uni->clean_string($str);
		}
		return $str;   
	} 

這個函數使用了 $config['permitted_uri_chars'] 直接過濾 post 過來的數據,很大原因就是元兇了。我把它單獨出來,經過測試發現,post $var = sprintf("%04d", 2); 過來,結果還是 $var = sprintf("%04d", 2); ,%04并未被過濾,看來還得細細地找。

3. 是 xss 的防御機制嗎?

stackoverflow 有個人說他完美解決了這個問題,是 xss clean 的原因。

:) God damn URLDECODE, I have looked at the code in URI.php but the xss clean is doing the job so I missed it. Thank you now everything is perfect. – RaduM

于是我找到了 core/security.php 下的 xss_clean() 函數。把函數體代碼全部注釋掉,發現輸入還是會把 %04 過濾掉,顯然也不是 xss 的問題。

4. 問題出在 _clean_input_data() 函數

重新回到 Input.php,發現 _clean_input_data 與 _clean_input_keys 有聯系。

$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);

于是把 _clean_input_data() 的函數體注釋掉,竟然輸入沒被過濾了。繼續縮小范圍,發現是這段代碼惹得禍:

// Remove control characters
// 就是這個會把%0x過濾掉
$str = remove_invisible_characters($str);

5. 元兇找到了 remove_invisible_characters() 函數

那么 remove_invisible_characters() 這個函數是什么呢?

這個函數在 core/Common.php中,我把它揪出來:

	function remove_invisible_characters($str, $url_encoded = TRUE)
	{
		$non_displayables = array();
		
		// every control character except newline (dec 10)
		// carriage return (dec 13), and horizontal tab (dec 09)
		
		if ($url_encoded)
		{
			$non_displayables[] = '/%0[0-8bcef]/';	// url encoded 00-08, 11, 12, 14, 15
			$non_displayables[] = '/%1[0-9a-f]/';	// url encoded 16-31
		}
		
		$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';	// 00-08, 11, 12, 14-31, 127

		do
		{
			$str = preg_replace($non_displayables, '', $str, -1, $count);
		}
		while ($count);

		return $str;
	}

看這么幾行代碼:

if ($url_encoded)
{
	$non_displayables[] = '/%0[0-8bcef]/';	// url encoded 00-08, 11, 12, 14, 15
	$non_displayables[] = '/%1[0-9a-f]/';	// url encoded 16-31
}

明確了吧,他會把%0與%1開頭的3個字符過濾掉。直接把這個注釋掉,問題解決。

記錄這個問題解決的思維全過程。

本文地址:http://www.bavugt.tw/librarys/veda/detail/1721,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.bavugt.tw/librarys/veda/detail/1721

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《Python在Unix和Linux系統管理中的應用》 Noab Gift (作者), Jeremy M.Jones (作者)

《Python在Unix和Linux系統管理中的應用(影印版)》作者們還構建了一個可以免費下載的Ubuntu虛擬機。該虛擬機包含了這《Python在Unix和Linux系統管理中的應用(影印版)》的源代碼,還可以用來運行書中的實例,包括SNMP、IPython、SQLAlchemy和許多其他工具。《Python在Unix和Linux系統管理中的應用》展示了Python語言如何提供一種更加高效的方式來處理Unix和Linux服務器管理工作中的各種任務。《Python在Unix和Linux系統管理中的應用(影印版)》的每一章都會提出一個特定的管理問題,例如并發或數據備份,然后通過實際的例子提供基于Python的解決方案。

更多計算機寶庫...

有极速快乐十分吗
能胜配资 德旺配资 海纳策略配资 微豪配资 中原河南麻将房卡 今日股票推荐哪个好广告 c18070s股票指数投资策略 基金配资哪家好 东北配资 如何炒股票