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

PHP ereg() 驗證檔案上傳副檔名與檔名規範(已棄用,請改用 preg_match)

     編輯:PHP 綜合知識

⚠️ 重要提醒

ereg()、eregi() 等 POSIX 正則函數自 PHP 5.3.0 棄用,PHP 7.0.0 移除。現代專案請統一使用 PCRE 函數 preg_match()。

原始 ereg 範例(僅供維護舊代碼參考)

if (!is_uploaded_file($upfile)) exit('未上傳檔案');

$name = $upfile_name; // $_FILES['file']['name']

// 1. 僅允許 .htm / .html
if (!ereg('\.(htm|html)$', $name)) exit('僅允許 .htm 或 .html');

// 2. 檔名不可含斜線
if (ereg('[/]', $name)) exit('檔名含非法字符 /');

move_uploaded_file($upfile, $target_dir.'/'.$name);

現代 preg_match 寫法

if (!is_uploaded_file($upfile)) exit('未上傳檔案');

$name = basename($upfile_name); // 取純檔名,防目錄遍歷

// 1. 副檔名白名單(大小寫不敏感)
if (!preg_match('/\.(htm|html)$/i', $name)) exit('僅允許 .htm 或 .html');

// 2. 檔名僅允許 中英數、底線、減號、點(不含路徑分隔符)
if (!preg_match('/^[\w\-\.]+$/', $name)) exit('檔名含非法字符');

// 3. 額外:長度限制
if (strlen($name) > 255) exit('檔名過長');

// 4. 重新命名儲存(避免覆蓋、注入)
$ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
$newName = bin2hex(random_bytes(16)).'.'.$ext;
move_uploaded_file($upfile, $target_dir.'/'.$newName);

完整上傳驗證清單(生產級)

  1. $_FILES['file']['error'] === UPLOAD_ERR_OK
  2. finfo_file(fopen($tmp,'r'), FILEINFO_MIME_TYPE) ∈ 白名單(text/html, text/plain...)
  3. getimagesize($tmp) 若為圖片驗證真實性
  4. 副檔名白名單 preg_match('/\.(jpe?g|png|gif|webp)$/i', $name)
  5. 檔名正則 preg_match('/^[\w\-\.]+$/', $name)
  6. 重新命名 + 移至非公開目錄
  7. 資料庫記錄原始檔名、儲存路徑、MIME、大小、上傳者

ereg → preg_match 快速對照

ereg 模式preg_match 模式說明
ereg('pattern', $str)preg_match('/pattern/', $str)加界定符 /
eregi('pattern', $str)preg_match('/pattern/i', $str)i 修飾符大小寫不敏感
[/][\/] 或直接 /正則中 / 需跳脫或換界定符 #pattern#
\.\.點號需跳脫

結論:全面改用 preg_match,配合 finfo、重新命名、Prepared Statements 構建安全上傳流程。

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