is_uploaded_file函數(shù)引發(fā)的不能上傳文件問題
更新時(shí)間:2013年10月29日 16:20:11 作者:
不能上傳文件,都返回失敗。經(jīng)過排查發(fā)現(xiàn)是PHP中的is_uploaded_file函數(shù)在搗鬼,下面是具體的處理方法,有類似情況的朋友可以參考下
起因:
在一個(gè)項(xiàng)目中,接到用戶反饋說其所有客戶不能上傳文件,都返回失敗。經(jīng)過排查發(fā)現(xiàn)是PHP中的is_uploaded_file函數(shù)在搗鬼。
細(xì)節(jié)分析:
在正常情況下,通過PHP 上傳文件 ,需要通過is_uploaded_file函數(shù)來判斷文件是否是通過 HTTP POST 上傳的,這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,例如 /etc/passwd。
而本次遇到的問題是本來應(yīng)該是C:/WINDOWS/Temp/php99.tmp這樣的tmp_name,卻變成了C://WINDOWS //Temp//php99.tmp這種,導(dǎo)致is_uploaded_file函數(shù)返回錯(cuò)誤的信息。
處理方式:
在加上如下代碼后,問題解決。
$file['tmp_name'] = str_replace('////', ‘//', $file['tmp_name']);
注意,“////”實(shí)際字符串就是兩個(gè)/,其他兩個(gè)是用來表示轉(zhuǎn)義的。
深入研究:
為什么在默寫特定的環(huán)境下會(huì)出現(xiàn)這種情況呢,我們來看如下分析:
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
在PHP的默認(rèn)配置中magic_quotes_gpc是On的,而打開了magic_quotes_gpc參數(shù)的PHP環(huán)境會(huì)自動(dòng)對(duì)GET/POST /Cookie添加addslashes效果。注意,并不會(huì)為$_FILES添加addslashes效果。
而當(dāng)magic_quotes_gpc是Off的時(shí)候,由于為$_FILES數(shù)組添加了addslashes作用,反而出現(xiàn)了問題。也就在 magic_quotes_gpc是Off的PHP環(huán)境下都會(huì)出現(xiàn)此問題。
順帶說句,SVN上的MooPHP代碼已經(jīng)修復(fù)此問題。
is_uploaded_file函數(shù)解析:
判斷文件是否是通過 HTTP POST 上傳的
bool is_uploaded_file ( string $filename )
如果 filename 所給出的文件是通過 HTTP POST 上傳的則返回 TRUE。這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,例如 /etc/passwd。 這種檢查顯得格外重要,如果上傳的文件有可能會(huì)造成對(duì)用戶或本系統(tǒng)的其他用戶顯示其內(nèi)容的話。
為了能使 is_uploaded_file() 函數(shù)正常工作,必段指定類似于 $_FILES['userfile']['tmp_name'] 的變量,而在從客戶端上傳的文件名 $_FILES['userfile']['name'] 不能正常運(yùn)作。
在一個(gè)項(xiàng)目中,接到用戶反饋說其所有客戶不能上傳文件,都返回失敗。經(jīng)過排查發(fā)現(xiàn)是PHP中的is_uploaded_file函數(shù)在搗鬼。
細(xì)節(jié)分析:
在正常情況下,通過PHP 上傳文件 ,需要通過is_uploaded_file函數(shù)來判斷文件是否是通過 HTTP POST 上傳的,這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,例如 /etc/passwd。
而本次遇到的問題是本來應(yīng)該是C:/WINDOWS/Temp/php99.tmp這樣的tmp_name,卻變成了C://WINDOWS //Temp//php99.tmp這種,導(dǎo)致is_uploaded_file函數(shù)返回錯(cuò)誤的信息。
處理方式:
在加上如下代碼后,問題解決。
$file['tmp_name'] = str_replace('////', ‘//', $file['tmp_name']);
注意,“////”實(shí)際字符串就是兩個(gè)/,其他兩個(gè)是用來表示轉(zhuǎn)義的。
深入研究:
為什么在默寫特定的環(huán)境下會(huì)出現(xiàn)這種情況呢,我們來看如下分析:
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
在PHP的默認(rèn)配置中magic_quotes_gpc是On的,而打開了magic_quotes_gpc參數(shù)的PHP環(huán)境會(huì)自動(dòng)對(duì)GET/POST /Cookie添加addslashes效果。注意,并不會(huì)為$_FILES添加addslashes效果。
而當(dāng)magic_quotes_gpc是Off的時(shí)候,由于為$_FILES數(shù)組添加了addslashes作用,反而出現(xiàn)了問題。也就在 magic_quotes_gpc是Off的PHP環(huán)境下都會(huì)出現(xiàn)此問題。
順帶說句,SVN上的MooPHP代碼已經(jīng)修復(fù)此問題。
is_uploaded_file函數(shù)解析:
判斷文件是否是通過 HTTP POST 上傳的
bool is_uploaded_file ( string $filename )
如果 filename 所給出的文件是通過 HTTP POST 上傳的則返回 TRUE。這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件,例如 /etc/passwd。 這種檢查顯得格外重要,如果上傳的文件有可能會(huì)造成對(duì)用戶或本系統(tǒng)的其他用戶顯示其內(nèi)容的話。
為了能使 is_uploaded_file() 函數(shù)正常工作,必段指定類似于 $_FILES['userfile']['tmp_name'] 的變量,而在從客戶端上傳的文件名 $_FILES['userfile']['name'] 不能正常運(yùn)作。
相關(guān)文章
php對(duì)數(shù)組內(nèi)元素進(jìn)行隨機(jī)調(diào)換的方法
這篇文章主要介紹了php對(duì)數(shù)組內(nèi)元素進(jìn)行隨機(jī)調(diào)換的方法,通過自定義函數(shù)實(shí)現(xiàn)對(duì)數(shù)組內(nèi)元素進(jìn)行隨機(jī)調(diào)換的功能,涉及php操作數(shù)組的相關(guān)技巧,需要的朋友可以參考下2015-05-05使用php語句將數(shù)據(jù)庫*.sql文件導(dǎo)入數(shù)據(jù)庫
這篇文章主要介紹了如何使用php語句將數(shù)據(jù)庫*.sql文件導(dǎo)入數(shù)據(jù)庫,需要的朋友可以參考下2014-05-05php中使用explode查找某個(gè)字符是否存在的方法
為了使輸入方便,減少在裝修編輯模塊的時(shí)候出現(xiàn)太多的文字框,需要用到在一個(gè)框內(nèi)輸入兩三種不同內(nèi)容,然后再使用一些特殊字符來分隔開,用explode來建立一組數(shù)據(jù)的方法。2011-07-07PHP實(shí)現(xiàn)通過get方式識(shí)別用戶發(fā)送郵件的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)通過get方式識(shí)別用戶發(fā)送郵件的方法,涉及php針對(duì)數(shù)據(jù)庫的讀取、判斷及session登陸的使用技巧,需要的朋友可以參考下2015-07-07php實(shí)現(xiàn)接口api數(shù)據(jù)簽名及驗(yàn)簽
api數(shù)據(jù)簽名作用就是通過使用簽名可以驗(yàn)證數(shù)據(jù)在傳輸過程中是否被篡改或修改,下面小編就來為大家介紹一下php如何實(shí)現(xiàn)接口api數(shù)據(jù)簽名及驗(yàn)簽吧2023-11-11php調(diào)用mysql存儲(chǔ)過程實(shí)例分析
這篇文章主要介紹了php調(diào)用mysql存儲(chǔ)過程,綜合各種常見實(shí)例分析了php調(diào)用mysql存儲(chǔ)過程的各種常見操作與使用技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12PHP的Yii框架中YiiBase入口類的擴(kuò)展寫法示例
這篇文章主要介紹了PHP的Yii框架中YiiBase入口類的擴(kuò)展寫法示例,同時(shí)詳細(xì)講解了import和autoload這兩個(gè)YiiBase中的重要方法,需要的朋友可以參考下2016-03-03