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

PHP 文件上傳 MIME 類型對照表與瀏覽器差異處理

     編輯:PHP 相關知識

前言

在 PHP 開發中處理文件上傳時,伺服器需識別上傳文件的 MIME 類型(如 .jpg 對應 image/jpeg)。這項判斷首先由瀏覽器在表單提交時完成,再傳遞給 PHP 處理。然而,不同瀏覽器對同一文件的 MIME 類型定義可能不一致,導致驗證邏輯出現漏洞。本文提供 IE 與 Firefox 的常見文件類型對照表,並示範如何安全限制上傳格式。

IE 與 Firefox MIME 類型對照表

ID副檔名IE 識別類型Firefox 識別類型
0gifimage/gifimage/gif
1jpgimage/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/avi
11rmvbapplication/vnd.rn-realmedia-vbrapplication/vnd.rn-realmedia-vbr
123gpapplication/octet-streamapplication/octet-stream
13flvapplication/octet-streamapplication/octet-stream
14mp3audio/mpegaudio/mpeg
15wavaudio/wavaudio/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/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
31htmltext/htmltext/html
32htmtext/htmltext/html
33ttfapplication/octet-streamapplication/octet-stream
34fonapplication/octet-streamapplication/octet-stream
35jsapplication/x-javascripttext/html
36xmltext/xmltext/xml
37dllapplication/octet-streamapplication/octet-stream
38dll/classapplication/octet-streamapplication/java

實戰範例:限制只允許上傳 Office 與 PDF 文件

以下程式碼展示如何根據 MIME 類型映射副檔名,並攔截非允許格式:

<?php
$temppath = $upfile['tmp_name'];
$fileinfo = pathinfo($upfile['name']);
$extension = $upfile['type']; // 取得瀏覽器回報的 MIME 類型

switch ($extension) {
    case 'application/msword':
        $extension = 'doc';
        break;
    case 'application/vnd.ms-excel':
        $extension = 'xls';
        break;
    case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
        $extension = 'docx';
        break;
    case 'application/vnd.ms-powerpoint':
        $extension = 'ppt';
        break;
    case 'application/pdf':
        $extension = 'pdf';
        break;
    case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
        $extension = 'xlsx';
        break;
    default:
        die('只允許上傳 doc, docx, xls, xlsx, pdf, ppt 文件 <a href="upload.php">重新上傳</a>');
}
?>

最佳實踐建議

  • 白名單機制:僅允許明確列出的 MIME 類型,拒絕其餘所有類型。
  • 雙重驗證:結合副檔名檢查與 finfo_file() 函數讀取文件真實 MIME 類型,防止偽裝文件繞過驗證。
  • 收集多瀏覽器類型:將主流瀏覽器可能回報的所有 MIME 類型納入白名單(如上表所示)。
  • 儲存安全:上傳目錄設為不可執行權限,文件重命名為隨機字串,避免直接訪問執行惡意腳本。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved