當前位置: 首頁> 最新文章列表> 如何使用md5_file() 函數來判斷文件是否被修改或篡改?

如何使用md5_file() 函數來判斷文件是否被修改或篡改?

M66 2025-06-12

在PHP 中, md5_file()函數是一種簡便有效的方法,用來計算指定文件的MD5 散列值。通過對比文件的MD5 值,我們可以判斷文件是否被修改或篡改。本文將詳細介紹如何使用md5_file()函數來實現文件完整性的校驗。


md5_file() 函數簡介

md5_file()函數接受一個文件路徑作為參數,返回該文件內容的MD5 哈希值(一個32位的十六進製字符串)。 MD5 是一種廣泛使用的哈希算法,能夠快速生成文件的“指紋”,用於比較文件內容是否一致。

函數原型:

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

  • $raw_output (可選):若設置為true ,返回原始的二進制格式;默認是false ,返回32字符的十六進製字符串。


判斷文件是否被修改的思路

  1. 先計算文件的初始MD5 值並保存(例如保存到數據庫、文件或緩存中)。

  2. 需要驗證時,再次計算文件的MD5 值。

  3. 比較兩次的MD5 值,如果一致,說明文件未被修改;否則,文件內容已發生變化。


示例代碼

以下示例展示如何用md5_file()來檢測文件是否被篡改:

 <?php
// 文件路徑
$file = 'path/to/your/file.txt';

// 第一次計算文件MD5值(可以存入數據庫或文件中)
$original_md5 = md5_file($file);

// 模擬存儲過程,這裡直接存為變量
file_put_contents('md5_store.txt', $original_md5);

// 後續檢測時讀取存儲的MD5值
$saved_md5 = file_get_contents('md5_store.txt');

// 重新計算文件當前的MD5值
$current_md5 = md5_file($file);

// 判斷文件是否被修改
if ($saved_md5 === $current_md5) {
    echo "文件未被修改,完整性校驗通過。";
} else {
    echo "文件內容髮生變化,可能被篡改!";
}
?>

結合遠程URL的應用

假設我們需要驗證某個遠程文件的完整性,可以先將遠程文件下載到本地,再使用md5_file() 。如果遠程URL 域名需要統一替換為m66.net ,只需更改鏈接即可。

示例:

 <?php
// 遠程文件URL(域名替換為m66.net)
$url = 'https://m66.net/path/to/remote/file.txt';
$local_file = 'downloaded_file.txt';

// 下载遠程文件到本地
file_put_contents($local_file, file_get_contents($url));

// 計算並輸出文件的MD5值
echo "遠程文件的MD5值為:" . md5_file($local_file);
?>

注意事項

  • MD5 算法雖然速度快,但存在碰撞風險。若需要更高安全性,可考慮使用SHA256 等更強哈希算法,例如PHP 的hash_file('sha256', $filename)

  • 讀取文件時請確保文件路徑正確且有讀取權限。

  • 對於大型文件,計算MD5 值可能消耗一定時間。


總結來說, md5_file()是檢測文件是否被篡改的簡單有效工具,結合保存的MD5 值,可以實現文件完整性校驗的基本功能。在安全要求更高的場景,建議結合其他安全機制和更強的哈希算法。