首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

PHP 圖片類型處理函數 imagetype 使用指南

     編輯:VC 教學

前言

PHP 內建 exif_imagetype() 與 getimagesize() 可快速判斷圖片類型,無需完整載入圖片資料。本文說明常用函數、回傳值常數、實戰範例與安全性注意事項。

核心函數對比

函數回傳值特點
exif_imagetype(string $file)int (IMAGETYPE_* 常數)僅讀取檔頭,極快,需 exif 擴充
getimagesize(string $file, array &$info)array [width, height, type, attr]回傳尺寸與類型,標準擴充即可用
mime_content_type(string $file)string (MIME type)基於 magic 資料庫,適用一般檔案

IMAGETYPE 常數對照表

常數值格式MIME
IMAGETYPE_GIF1GIFimage/gif
IMAGETYPE_JPEG2JPEGimage/jpeg
IMAGETYPE_PNG3PNGimage/png
IMAGETYPE_SWF4Flashapplication/x-shockwave-flash
IMAGETYPE_PSD5Photoshopimage/vnd.adobe.photoshop
IMAGETYPE_BMP6BMPimage/bmp
IMAGETYPE_TIFF_II / _MM7/8TIFF (little/big endian)image/tiff
IMAGETYPE_JPC9JPEG 2000image/jp2
IMAGETYPE_JP210JPEG 2000image/jp2
IMAGETYPE_JPX11JPEG 2000 延伸image/jpx
IMAGETYPE_JB212JBIG2image/jb2
IMAGETYPE_SWC13Flash (壓縮)application/x-shockwave-flash
IMAGETYPE_IFF14IFFimage/iff
IMAGETYPE_WBMP15Wireless BMPimage/vnd.wap.wbmp
IMAGETYPE_XBM16XBMimage/x-xbm
IMAGETYPE_ICO17ICOimage/vnd.microsoft.icon
IMAGETYPE_WEBP18WebPimage/webp

實戰範例

1. 上傳驗證:只允許 JPEG/PNG/GIF

$allowed = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF];
$type = exif_imagetype($_FILES['avatar']['tmp_name']);

if (!in_array($type, $allowed, true)) {
    die('只允許上傳 JPG、PNG、GIF 圖片');
}

// 取得副檔名
$ext = image_type_to_extension($type, false); // ".jpeg", ".png", ".gif"
$saveName = 'avatar_' . time() . $ext;
move_uploaded_file($_FILES['avatar']['tmp_name'], $saveName);

2. 取得圖片尺寸與 MIME

$info = getimagesize('photo.jpg');
if ($info !== false) {
    list($width, $height, $type, $attr) = $info;
    $mime = $info['mime']; // image/jpeg
    echo "{$width}x{$height}, {$mime}";
}

3. 遠端 URL 圖片類型檢查

$url = 'https://example.com/banner.png';
$type = @exif_imagetype($url); // 需 allow_url_fopen=On
if ($type === false) {
    // 可能非圖片、無法存取、或非支援格式
}

安全性最佳實踐

⚠ 必須防範的風險

  1. 副檔名偽裝:shell.php.jpg 實為 PHP 腳本 → 必須用檔頭判斷
  2. getimagesize() 可能觸發 XXE/SSRF(處理 SVG 等) → 禁止處理向量格式
  3. 大檔案導致 記憶體耗盡 → 先檢查 $_FILES['size']、設定 upload_max_filesize
  4. 雙重副檔名 photo.jpg.exe → 儲存時強制使用檔頭推斷副檔名

安全上傳流程

// 1. 檢查檔案大小
if ($_FILES['img']['size'] > 5 * 1024 * 1024) die('檔案過大');

// 2. 檢查檔頭類型
$type = exif_imagetype($_FILES['img']['tmp_name']);
$allowed = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF, IMAGETYPE_WEBP];
if (!in_array($type, $allowed, true)) die('不支援的圖片格式');

// 3. 取得安全副檔名
$ext = image_type_to_extension($type, false);

// 4. 重新命名儲存(避免覆蓋、路徑遍歷)
$dest = '/var/www/uploads/' . bin2hex(random_bytes(16)) . $ext;
move_uploaded_file($_FILES['img']['tmp_name'], $dest);

// 5. (可選) 重新壓縮/去除 EXIF,進一步降低風險
$img = imagecreatefromstring(file_get_contents($dest));
// ... 處理後存回

結語

正確判斷圖片類型是檔案上傳安全的第一道防線。請務必使用 exif_imagetype() 或 getimagesize() 檢查檔頭,拒絕信任副檔名與瀏覽器回報的 MIME,並搭配重新命名、尺寸限制、權限隔離等纵深防禦措施。

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