專案中用戶回報所有檔案上傳失敗,經排查發現 $_FILES['file']['tmp_name'] 路徑異常:
C:/WINDOWS/Temp/php99.tmpC://WINDOWS//Temp//php99.tmp(雙斜線)導致 is_uploaded_file() 回傳 false,上傳邏輯判定失敗。
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']);
?>
注意: 代碼中的 '////' 實為字串 '//'(兩個斜線),前兩個為跳脫字元。
bool is_uploaded_file ( string $filename )
/etc/passwd)。$_FILES['userfile']['tmp_name'],**不可使用** $_FILES['userfile']['name'](客戶端原始檔名)。magic_quotes_gpc**(PHP 5.4+ 已移除),統一由應用層處理轉義。$_FILES 手動 addslashes**;若框架自動處理,請檢查配置。<?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 等框架已修復此問題,升級框架或套用補丁可徹底解決。