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

PHP 檔案上傳 MIME 類型對照表(IE / Firefox 實測版)

     編輯:PHP 相關知識

前言

瀏覽器上傳檔案時會依副檔名與檔案簽名判斷 MIME 類型,不同瀏覽器對同一檔案回報的 MIME 可能不同。後端驗證時務必以「白名單 + 檔案簽名二次檢查」為準,不可單信 $_FILES['file']['type']。

常見副檔名與 PHP 接收到的 MIME 類型對照(實測)

ID副檔名PHP 接收 MIME (IE / Firefox 多數一致)
0gifimage/gif
1jpg / jpegimage/pjpeg (IE) / image/jpeg (FF)
2pngimage/x-png (IE) / image/png (FF)
3bmpimage/bmp
4psdapplication/octet-stream
5icoimage/x-icon
6rarapplication/octet-stream
7zipapplication/x-zip-compressed
87zapplication/octet-stream
9exeapplication/octet-stream
10avivideo/avi
11rmvbapplication/vnd.rn-realmedia-vbr
123gpapplication/octet-stream
13flvapplication/octet-stream
14mp3audio/mpeg
15wavaudio/wav
16krcapplication/octet-stream
17lrcapplication/octet-stream
18txttext/plain
19docapplication/msword
20xlsapplication/vnd.ms-excel
21pptapplication/vnd.ms-powerpoint
22pdfapplication/pdf
23chmapplication/octet-stream
24mdbapplication/msaccess
25sqltext/plain
26conapplication/octet-stream
27logtext/plain
28dattext/plain
29iniapplication/octet-stream
30phpapplication/octet-stream
31htmltext/html
32htmtext/html

安全驗證最佳實踐

function validateUpload($file, array $allowedMimes, array $allowedExts) {
    // 1. 檢查上傳錯誤碼
    if ($file['error'] !== UPLOAD_ERR_OK) {
        throw new Exception('上傳失敗,錯誤碼: ' . $file['error']);
    }

    // 2. 副檔名白名單(小寫比對)
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    if (!in_array($ext, $allowedExts)) {
        throw new Exception('副檔名不允許: ' . $ext);
    }

    // 3. MIME 白名單(參考值,非絕對)
    if (!in_array($file['type'], $allowedMimes)) {
        // 可選:僅記錄警告,不阻擋
        error_log("MIME 不符: {$file['type']} vs 允許列表");
    }

    // 4. **關鍵:檔案簽名驗證**
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $realMime = $finfo->file($file['tmp_name']);
    if (!in_array($realMime, $allowedMimes)) {
        throw new Exception("檔案內容類型不符: $realMime");
    }

    // 5. 尺寸限制
    if ($file['size'] > 10 * 1024 * 1024) { // 10MB
        throw new Exception('檔案過大');
    }

    return true;
}

// 使用範例:僅允許圖片
$allowedMimes = ['image/gif', 'image/jpeg', 'image/png', 'image/webp'];
$allowedExts  = ['gif', 'jpg', 'jpeg', 'png', 'webp'];
validateUpload($_FILES['avatar'], $allowedMimes, $allowedExts);

進階防禦清單

  • 儲存時**重新命名**(UUID + 正確副檔名),不使用原始檔名。
  • 上傳目錄**禁用腳本執行權限**(Nginx: location ~ \.php$ { deny all; })。
  • 病毒掃描整合:ClamAV clamscan 或雲端 API。
  • 圖片二次處理:GD/Imagick 重新壓縮、剝離 EXIF、轉換為 WebP。
  • 大檔案分片上傳:前端切片、後端合併,避免 PHP post_max_size/upload_max_filesize 限制。

常見誤區

  1. 信任 $_FILES['type']:瀏覽器僅依副檔名猜測,極易偽造。
  2. 只檢查副檔名:shell.php.jpg 可能繞過。
  3. 未檢查 $_FILES['error']:部分錯誤碼(如 UPLOAD_ERR_PARTIAL)仍會產生暫存檔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved