最小原型 (upload.php)
2 * 1024 * 1024) {
die("檔案不得超過 2MB");
}
// 安全檔名
$ext = pathinfo($up['name'], PATHINFO_EXTENSION);
$name = bin2hex(random_bytes(8)) . ".$ext";
$dest = __DIR__ . "/uploads/$name";
if (!is_dir(dirname($dest))) mkdir(dirname($dest), 0755, true);
if (move_uploaded_file($up['tmp_name'], $dest)) {
echo "上傳成功:$name";
} else {
die("移動檔案失敗");
}
}
?>
安全加固清單
- MIME 偽裝防護:使用
finfo_file(finfo_open(FILEINFO_MIME_TYPE), $tmp) 再次驗證真實類型。
- 禁用執行權限:上傳目錄設定
php_flag engine off (Apache) 或移除執行權限,防止上傳 PHP 惡意腳本執行。
- 檔名隨機化:避免覆蓋、路徑遍歷、特殊字元問題。
- 尺寸限制:
php.ini upload_max_filesize、post_max_size 同步設定。
- 圖片重處理:用 GD/ImageMagick 重新壓縮儲存,剝離 EXIF、殘留腳本碼。
- 病毒掃描:整合 ClamAV 掃描上傳暫存檔。
進階功能擴充
- 多檔上傳:
name="images[]" 迴圈處理 $_FILES['images']。
- 拖曳上傳:前端
drop 事件 + FormData AJAX 送出。
- 縮圖生成:上傳後同步建立多種尺寸供列表/詳情頁使用。
- 資料庫記錄:儲存原始檔名、儲存路徑、上傳者、時間、標籤等中繼資料。