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

PHP 檔案上傳完整實作:從表單到安全儲存的最佳實踐

     編輯:PHP 相關知識

PHP 檔案上傳完整實作:從表單到安全儲存的最佳實踐

前端表單 (index.php)

<form enctype="multipart/form-data" action="uploadProcess.php" method="post" name="myform">

用戶名:<input type="text" name="username" /><br />

密碼:<input type="password" name="pwd" /><br />

上傳圖片:<input type="file" name="upimage"><br />

<input type="submit" name="sub" value="提交">

</form>

關鍵點: enctype="multipart/form-data" 必須設定,否則 $_FILES 為空。

後端處理 (uploadProcess.php)

<?php

$filetype_arr = array("image/jpeg","image/png","image/gif"); // 允許類型

if(!empty($_POST['sub'])){

$username = $_POST['username'];

$password = $_POST['pwd'];

if(is_uploaded_file($_FILES['upimage']['tmp_name'])){

$tmp_name = $_FILES['upimage']['tmp_name'];

// 類型驗證

if(!in_array($_FILES['upimage']['type'], $filetype_arr)){

echo "抱歉,僅支援: " . implode("、", $filetype_arr);

exit();

}

// 取得副檔名

$exten_name = substr($_FILES['upimage']['name'], strrpos($_FILES['upimage']['name'], "."));

// 目標目錄:/php/upfile/{username}/

$dest_name = $_SERVER['DOCUMENT_ROOT'] . "/php/upfile/" . $username . "/";

// 目錄不存在則建立

if(!file_exists($dest_name)){

if(!mkdir($dest_name, 0755, true)){

echo "建立目錄失敗,無法上傳";

exit();

}

}

// 移動暫存檔並重命名:時間戳+隨機數+副檔名

$new_name = $dest_name . time() . rand(1,100) . $exten_name;

if(move_uploaded_file($tmp_name, $new_name)){

echo "上傳成功";

}else{

echo "上傳失敗";

}

}else{

echo "找不到上傳檔案,請重試";

}

}

?>

安全加固清單(生產環境必做)

  1. 雙重驗證:MIME 類型 + 檔案副檔名 + getimagesize() 驗證圖片真實性
  2. 儲存路徑隔離:上傳目錄設為不可執行(Nginx/Apache 禁用 PHP 解析)
  3. 檔名隨機化:避免覆蓋、防止路徑遍歷、阻擋惡意腳本執行
  4. 大小限制:php.ini upload_max_filesize + 代碼層 $_FILES['size'] 雙重限制
  5. 病毒掃描:整合 ClamAV 等掃描引擎

常見錯誤排查

  • $_FILES['upimage']['error'] 非 0:對照錯誤碼表(1=超過 upload_max_filesize,2=超過 MAX_FILE_SIZE,4=未上傳檔案等)
  • 權限不足:確認目錄對 PHP-FPM 使用者可寫
  • 上傳大檔案失敗:調整 post_max_size、max_execution_time、memory_limit
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved