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

PHP 文件上傳:完整副檔名與 MIME 類型對照表(涵蓋主流瀏覽器差異)

     編輯:PHP 綜合知識

前言:為什麼需要關注 MIME 類型?

在 PHP 開發中,檔案上傳是常見功能。許多開發者只檢查副檔名,卻忽略了瀏覽器回傳的 MIME 類型($_FILES['file']['type'])會因瀏覽器而異。同一個檔案,IE 與 Firefox 可能送出完全不同的 MIME 字串,導致驗證邏輯失效。本文整理最完整的對照表,並說明跨瀏覽器處理的關鍵點。

核心觀念

  • 瀏覽器先解析檔案類型,再送至 PHP;PHP 再根據檔案內容判斷真實類型。
  • 副檔名可任意修改,不可作為唯一信任依據。
  • IE 與 Firefox(以及現代 Chrome/Edge)對同一副檔名回傳的 MIME 往往不同,伺服器端需同時容納多種值。

常見檔案類型對照表(IE vs Firefox)

ID 副檔名 IE 回傳 MIME Firefox 回傳 MIME 備註
0gifimage/gifimage/gif圖片檔
1jpg / jpegimage/jpegimage/pjpeg
2pngimage/pngimage/x-png
3bmpimage/bmpimage/bmp
4psdapplication/octet-streamapplication/octet-stream
5icoimage/x-iconimage/x-icon
6rarapplication/octet-streamapplication/octet-stream壓縮檔
7zipapplication/zipapplication/x-zip-compressed
87zapplication/octet-streamapplication/octet-stream
9exeapplication/octet-streamapplication/octet-stream可執行檔
10avivideo/avivideo/x-msvideo影音檔
11rmvbapplication/vnd.rn-realmedia-vbrapplication/vnd.rn-realmedia-vbr
123gpapplication/octet-streamapplication/octet-stream
13flvapplication/octet-streamapplication/octet-stream
14mp3audio/mpegaudio/mpeg音訊檔
15wavaudio/wavaudio/x-wav
16krcapplication/octet-streamapplication/octet-stream歌詞檔
17lrcapplication/octet-streamapplication/octet-stream
18txttext/plaintext/plain文件/文本
19docapplication/mswordapplication/msword
20xlsapplication/vnd.ms-excelapplication/vnd.ms-excel
21pptapplication/vnd.ms-powerpointapplication/vnd.ms-powerpoint
22pdfapplication/pdfapplication/pdf
23chmapplication/octet-streamapplication/octet-stream其他
24mdbapplication/msaccessapplication/x-msaccess資料庫
25sqlapplication/octet-streamtext/plain腳本/資料
26conapplication/octet-streamapplication/octet-stream系統/日誌
27logtext/plaintext/plain
28datapplication/octet-streamtext/plain
29iniapplication/octet-streamapplication/octet-stream
30phpapplication/octet-streamapplication/octet-stream程式碼
31html / htmtext/htmltext/html網頁
32xmltext/xmltext/xml
33ttfapplication/octet-streamapplication/octet-stream字型
34fonapplication/octet-streamapplication/octet-stream
35jsapplication/x-javascripttext/html腳本
36dllapplication/octet-streamapplication/x-msdownload程式庫
37classapplication/octet-streamapplication/java-vmJava 類別

擴充 MIME 類型參考(更多副檔名)

以下為更完整的副檔名對應表,可直接用於 mime_content_type() 或自定義白名單:

.ai   application/postscript
.asf  video/x-ms-asf
.avi  video/x-msvideo
.css  text/css
.csv  text/csv
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.eot  application/vnd.ms-fontobject
.eps  application/postscript
.gif  image/gif
.gz   application/gzip
.htm  text/html
.html text/html
.ico  image/x-icon
.jpg  image/jpeg
.jpeg image/jpeg
.js   application/javascript
.json application/json
.mp3  audio/mpeg
.mp4  video/mp4
.otf  font/otf
.pdf  application/pdf
.png  image/png
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.rar  application/vnd.rar
.svg  image/svg+xml
.tar  application/x-tar
.tif  image/tiff
.tiff image/tiff
.ttf  font/ttf
.txt  text/plain
.woff font/woff
.woff2 font/woff2
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml  application/xml
.zip  application/zip

最佳實務建議

  1. 雙重驗證:同時檢查副檔名白名單與 MIME 類型白名單(包含所有瀏覽器可能值)。
  2. 使用 finfo 擴展:透過 finfo_file() 讀取檔案真實 MIME,避免瀏覽器誤報或偽造。
  3. 限制上傳目錄權限:上傳目錄不可執行腳本(設定 php_flag engine off 或 Nginx/Apache 禁止解析)。
  4. 重新命名儲存:以亂數或雜湊值命名,副檔名依白名單映射,避免路徑遍歷與覆蓋。
  5. 檔案大小限制:設定 upload_max_filesize、post_max_size 並前端二次檢查。

程式碼範例:安全的 MIME 驗證

<?php
$allowedMimes = [
    'image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png',
    'application/pdf', 'application/zip', 'application/x-zip-compressed',
    'text/plain', 'text/csv',
];
$allowedExt  = ['gif','jpg','jpeg','png','pdf','zip','txt','csv'];

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime  = $finfo->file($_FILES['file']['tmp_name']);
$ext   = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));

if (!in_array($mime, $allowedMimes, true) || !in_array($ext, $allowedExt, true)) {
    die('檔案類型不允許上傳');
}
// 後續移動、重命名、入庫...
?>

總結

掌握各瀏覽器 MIME 差異、善用 finfo 驗證真實檔案類型、配合副檔名白名單與安全儲存策略,才能建立健壯的 PHP 檔案上傳功能。本表可作為專案白名單的基礎參考,建議根據實際業務需求裁剪擴充。

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