當前位置: 首頁> 最新文章列表> 如何使用hash_update_stream 函數安全地對上傳文件進行哈希校驗?

如何使用hash_update_stream 函數安全地對上傳文件進行哈希校驗?

M66 2025-06-23

在進行文件上傳操作時,確保文件的完整性與安全性是非常重要的一步。為了驗證文件在上傳過程中是否被篡改,我們可以使用哈希校驗。 PHP 提供了hash_update_stream函數,可以高效地對大型文件進行哈希校驗。

本文將詳細介紹如何使用hash_update_stream函數進行文件的哈希校驗,並確保文件的安全性。

1. 什麼是hash_update_stream函數?

hash_update_stream是PHP 內置的哈希函數,它能夠實時地處理一個流(如文件流),並對其進行哈希運算。相較於一次性加載整個文件進行哈希校驗, hash_update_stream函數能夠節省內存資源,適用於大文件的校驗。

函數簽名如下:

 bool hash_update_stream ( resource $context , resource $file )
  • $context : 哈希上下文資源,由hash_init函數創建。

  • $file : 文件資源,通常是通過fopen函數打開的文件流。

2. 使用hash_update_stream對上傳文件進行哈希校驗

2.1 上傳文件的基本處理

在上傳文件時,通常會使用$_FILES超全局數組來獲取文件信息。在進行哈希校驗之前,我們需要先檢查文件是否有效並進行處理。

以下是一個上傳文件的基本示例:

 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    
    // 檢查文件是否上傳成功
    if ($file['error'] === UPLOAD_ERR_OK) {
        $filePath = $file['tmp_name']; // 臨時文件路徑
        $fileName = $file['name'];
        
        // 執行哈希校驗
        if (checkFileHash($filePath)) {
            echo "文件哈希校驗成功,文件安全。";
        } else {
            echo "文件哈希校驗失敗,文件可能已被篡改。";
        }
    } else {
        echo "文件上傳失敗,錯誤代碼:" . $file['error'];
    }
}

2.2 使用hash_update_stream進行文件哈希校驗

接下來,我們編寫一個checkFileHash函數,使用hash_update_stream函數對上傳的文件進行哈希計算。

 function checkFileHash($filePath) {
    // 創建一個SHA256哈希上下文
    $hashContext = hash_init('sha256');

    // 打開文件流
    $fileStream = fopen($filePath, 'rb');
    if ($fileStream === false) {
        return false; // 无法打開文件流
    }

    // 使用 hash_update_stream 對文件流進行哈希計算
    if (hash_update_stream($hashContext, $fileStream)) {
        // 獲取最終的哈希值
        $fileHash = hash_final($hashContext);
        fclose($fileStream);

        // 你可以將哈希值與預期值進行比較,確保文件沒有被篡改
        // 這裡的示例值 `預期哈希值` 為示例,你需要替換成實際的正確哈希值
        $expectedHash = '預期哈希值';
        return $fileHash === $expectedHash;
    }

    fclose($fileStream);
    return false; // 哈希計算失敗
}

2.3 為什麼要使用hash_update_stream

hash_update_stream函數的主要優勢在於它能夠處理流數據,不需要將整個文件加載到內存中。對於大文件來說,使用hash_update_stream比一次性加載整個文件併計算哈希要更加高效,尤其是在內存資源有限的環境下。

3. 總結

使用hash_update_stream函數對上傳文件進行哈希校驗,不僅能夠有效防止文件在上傳過程中被篡改,還能夠處理大文件,避免佔用過多內存。通過結合文件的哈希值與預期值的對比,我們能夠驗證文件的完整性,從而提高系統的安全性。

在實際應用中,你可以根據需要選擇不同的哈希算法(如sha256md5等)來進行文件驗證。