首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP is_uploaded_file 失效問題:雙斜線路徑導致上傳失敗

     編輯:PHP 綜合知識

問題現象

專案中用戶回報所有檔案上傳失敗,經排查發現 $_FILES['file']['tmp_name'] 路徑異常:

  • 正常:C:/WINDOWS/Temp/php99.tmp
  • 異常:C://WINDOWS//Temp//php99.tmp(雙斜線)

導致 is_uploaded_file() 回傳 false,上傳邏輯判定失敗。

根因分析:magic_quotes_gpc 影響

PHP 設定 magic_quotes_gpc = On 時,會自動對 $_GET、$_POST、$_COOKIE 執行 addslashes(),**但不影響 $_FILES**。

然而,某些框架或舊代碼會手動對 $_FILES 執行 addslashes()(或 addcslashes()),當 magic_quotes_gpc = Off 時,這層額外轉義導致路徑中的單斜線變成雙斜線,進而干擾 is_uploaded_file() 的路徑比對。

修正方案

在檢查前標準化路徑:

<?php
$file['tmp_name'] = str_replace('//', '/', $file['tmp_name']);
// 或更嚴謹:僅替換連續雙斜線
$file['tmp_name'] = preg_replace('#/{2,}#', '/', $file['tmp_name']);
?>

注意: 代碼中的 '////' 實為字串 '//'(兩個斜線),前兩個為跳脫字元。

is_uploaded_file 函數詳解

bool is_uploaded_file ( string $filename )
  • 功能:判斷檔案是否透過 HTTP POST 上傳。
  • 用途:防止惡意用戶偽造路徑讀取敏感檔案(如 /etc/passwd)。
  • 必要參數:必須傳入 $_FILES['userfile']['tmp_name'],**不可使用** $_FILES['userfile']['name'](客戶端原始檔名)。

最佳實踐建議

  1. **關閉 magic_quotes_gpc**(PHP 5.4+ 已移除),統一由應用層處理轉義。
  2. **勿對 $_FILES 手動 addslashes**;若框架自動處理,請檢查配置。
  3. 上傳處理流程:
<?php
// 1. 標準化路徑
$tmpName = preg_replace('#/{2,}#', '/', $_FILES['file']['tmp_name']);

// 2. 驗證上傳來源
if (!is_uploaded_file($tmpName)) {
    die('非法上傳來源');
}

// 3. 進一步驗證(MIME、大小、副檔名等)
// ...

// 4. 移動檔案
move_uploaded_file($tmpName, $destination);
?>

MooPHP 等框架已修復此問題,升級框架或套用補丁可徹底解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved