is_uploaded_file函數引發的不能上傳檔案問題_PHP教程

來源:互聯網
上載者:User
起因:

在一個項目中,接到使用者反饋說其所有客戶不能上傳檔案,都返回失敗。經過排查發現是PHP中的is_uploaded_file函數在搗鬼。

細節分析:

在正常情況下,通過PHP 上傳檔案 ,需要通過is_uploaded_file函數來判斷檔案是否是通過 HTTP POST 上傳的,這可以用來確保惡意的使用者無法欺騙指令碼去訪問本不能訪問的檔案,例如 /etc/passwd。
而本次遇到的問題是本來應該是C:/WINDOWS/Temp/php99.tmp這樣的tmp_name,卻變成了C://WINDOWS //Temp//php99.tmp這種,導致is_uploaded_file函數返回錯誤的資訊。

處理方式:

在加上如下代碼後,問題解決。
$file['tmp_name'] = str_replace('////', ‘//', $file['tmp_name']);
注意,“////”實際字串就是兩個/,其他兩個是用來表示轉義的。

深入研究:

為什麼在默寫特定的環境下會出現這種情況呢,我們來看如下分析:
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
在PHP的預設配置中magic_quotes_gpc是On的,而開啟了magic_quotes_gpc參數的PHP環境會自動對GET/POST /Cookie添加addslashes效果。注意,並不會為$_FILES添加addslashes效果。
而當magic_quotes_gpc是Off的時候,由於為$_FILES數組添加了addslashes作用,反而出現了問題。也就在 magic_quotes_gpc是Off的PHP環境下都會出現此問題。

順帶說句,SVN上的MooPHP代碼已經修複此問題。

is_uploaded_file函數解析:

判斷檔案是否是通過 HTTP POST 上傳的
bool is_uploaded_file ( string $filename )
如果 filename 所給出的檔案是通過 HTTP POST 上傳的則返回 TRUE。這可以用來確保惡意的使用者無法欺騙指令碼去訪問本不能訪問的檔案,例如 /etc/passwd。 這種檢查顯得格外重要,如果上傳的檔案有可能會造成對使用者或本系統的其他使用者顯示其內容的話。

為了能使 is_uploaded_file() 函數正常工作,必段指定類似於 $_FILES['userfile']['tmp_name'] 的變數,而在從用戶端上傳的檔案名稱 $_FILES['userfile']['name'] 不能正常運作。

http://www.bkjia.com/PHPjc/824960.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/824960.htmlTechArticle起因: 在一個項目中,接到使用者反饋說其所有客戶不能上傳檔案,都返回失敗。經過排查發現是PHP中的is_uploaded_file函數在搗鬼。 細節分析...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.