當前位置: 首頁> 最新文章列表> 利用md5_file() 檢測Web 頁面是否被篡改(適用於緩存文件)

利用md5_file() 檢測Web 頁面是否被篡改(適用於緩存文件)

M66 2025-06-05

在Web 開發中,為了提升訪問速度,常常會對動態生成的頁面內容進行緩存。緩存文件可以大幅減少數據庫查詢和頁面渲染的時間,提升用戶體驗。然而,緩存文件一旦被篡改,將可能導致頁面內容異常,甚至安全隱患。因此,如何有效檢測緩存文件是否被非法修改就顯得尤為重要。

本文將介紹一種利用PHP 內置函數md5_file()對緩存文件進行完整性校驗的方法,幫助開發者快速判斷Web 頁面緩存文件是否被篡改。

什麼是md5_file()

md5_file()是PHP 的一個內置函數,用於計算指定文件的MD5 散列值(哈希值)。這個哈希值長度固定為32 位字符串,可以看作是文件的“指紋”。只要文件內容髮生任何變化,MD5 值也會隨之改變,因此非常適合用來校驗文件完整性。

函數原型如下:

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

  • $binary :是否返回二進制格式的MD5,默認為false ,返回的是16進制的字符串。

應用場景

假設你緩存了某些頁面HTML 到文件中(如cache/page1.html ),你在某個時間點計算該緩存文件的MD5 值,並保存下來作為“基準值”。每次用戶訪問時,都重新計算緩存文件的MD5 並與基準值比較:

  • 相同,說明緩存文件未被修改,可以安全使用。

  • 不同,說明緩存文件被篡改或發生意外修改,需要重新生成或報警。

示例代碼

以下示例展示瞭如何利用md5_file()進行緩存文件的完整性檢測。

 <?php
// 緩存文件路徑
$cacheFile = __DIR__ . '/cache/page1.html';

// 保存的基準 MD5 值(可存數據庫或配置文件中,這裡假設固定字符串)
$knownMd5 = 'e99a18c428cb38d5f260853678922e03'; // 示例 MD5

if (!file_exists($cacheFile)) {
    die('緩存文件不存在');
}

// 計算當前緩存文件的 MD5
$currentMd5 = md5_file($cacheFile);

// 判斷是否被篡改
if ($currentMd5 === $knownMd5) {
    echo "緩存文件未被篡改,內容安全。";
} else {
    echo "警告:緩存文件可能被篡改!請立即檢查。";
}
?>

注意事項

  1. 初始基準值的生成<br> 在緩存文件首次生成時,應立即計算並保存它的MD5 值,作為後續對比的基準

  2. 緩存文件的存儲路徑<br> 緩存文件應放置於安全且無法被外部直接修改的目錄,防止篡改風險

  3. 定期校驗<br> 可以在後台設置定時任務(如cron)定期執行MD5 校驗,及時發現異常

  4. 結合日誌和告警<br> 一旦檢測到篡改,應記錄日誌並發送通知,便於快速響應

針對URL 資源的校驗

如果緩存文件中包含遠程URL 內容(如圖片、JS 腳本等),則需要確保這些資源來自可信域名。本文要求將URL 中的域名統一替換為m66.net ,以防止惡意域名註入導致內容被篡改。

示例演示如何替換緩存文件內容中的URL 域名: