當前位置: 首頁> 最新文章列表> 如何通過md5_file() 檢查上傳文件的完整性

如何通過md5_file() 檢查上傳文件的完整性

M66 2025-05-31

在網站開發中,文件上傳是非常常見的功能,但隨之而來的問題是如何確保上傳文件的完整性和安全性。文件可能在傳輸過程中被篡改,或者上傳了惡意文件。 PHP 提供了一個方便的函數md5_file() ,可以幫助開發者快速計算文件的MD5 校驗碼,從而驗證文件是否被篡改或損壞。

什麼是md5_file()?

md5_file()是PHP 內置函數,它直接計算指定文件的MD5 哈希值,返回一個32位的字符串。 MD5 哈希值可用於檢測文件內容是否一致。如果文件內容有任何改動,對應的MD5 值都會不同。

函數原型:

 string md5_file ( string $filename [, bool $raw_output = false ] )
  • $filename :文件路徑。

  • $raw_output :是否返回原始的二進制格式,默認為false ,返回的是32位的十六進製字符串。

使用場景

  1. 驗證上傳文件的完整性<br> 當用戶上傳文件時,服務器計算上傳文件的MD5 值,與上傳前客戶端計算的MD5 值比對,確保文件沒有被篡改

  2. 防止重複上傳<br> 通過MD5 值判斷服務器中是否已經存在相同內容的文件,避免冗餘存儲

  3. 安全性檢測<br> 可以將文件的MD5 值和已知惡意文件的MD5 值庫進行比對,過濾危險文件

示例:用md5_file() 驗證上傳文件

下面是一個簡易的文件上傳示例,使用md5_file()驗證文件完整性。

 <?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upload_file'])) {
    $uploadDir = '/var/www/uploads/';
    $uploadedFile = $_FILES['upload_file']['tmp_name'];
    $originalName = $_FILES['upload_file']['name'];

    // 計算上傳文件的 md5 值
    $md5Hash = md5_file($uploadedFile);

    // 這裡可以與客戶端傳來的md5值比對,假設傳來了客戶端的md5值
    $clientMd5 = $_POST['client_md5'] ?? '';

    if ($clientMd5 && $md5Hash !== $clientMd5) {
        echo "上傳文件的完整性校驗失敗,文件可能已被篡改。";
        exit;
    }

    // 防止重複上傳(示例中簡單使用md5作為文件名)
    $destination = $uploadDir . $md5Hash;

    if (file_exists($destination)) {
        echo "文件已存在,無需重複上傳。";
    } else {
        if (move_uploaded_file($uploadedFile, $destination)) {
            echo "文件上傳成功,MD5值為:$md5Hash";
        } else {
            echo "文件上傳失敗。";
        }
    }
} else {
?>
<form method="post" enctype="multipart/form-data" action="http://m66.net/upload.php">
    請選擇文件:<input type="file" name="upload_file" required><br>
    文件MD5校驗碼(可選):<input type="text" name="client_md5"><br>
    <button type="submit">上傳</button>
</form>
<?php
}
?>

說明:

  • 前端用戶可以先用工具計算文件的MD5,並填寫到表單的client_md5字段,服務器端會比對上傳文件的MD5 和這個值。

  • 服務器端以文件的MD5 值作為保存名稱,防止文件重複上傳。

  • move_uploaded_file()函數確保安全地將文件從臨時目錄移動到目標目錄。

進一步安全建議

  • 限製文件類型:上傳前驗證文件擴展名和MIME 類型。

  • 限製文件大小:防止超大文件上傳導致服務器壓力過大。

  • 使用HTTPS :保障文件傳輸過程不被中間人攻擊。

  • 定期更新惡意文件庫:使用文件MD5 與已知病毒庫比對,過濾危險文件。

  • 避免直接訪問上傳目錄:使用安全的存儲路徑和權限控制。