在日常網站開發與運維中,文件的完整性是系統安全的重要組成部分。一旦有文件被篡改,可能意味著系統遭受攻擊或者數據洩露。為了應對這種情況,我們可以用PHP內置的md5_file()函數構建一個簡單而實用的文件完整性檢測工具。
md5_file()是PHP提供的一個函數,用於直接計算指定文件的MD5哈希值。其基本語法如下:
md5_file(string $filename, bool $binary = false): string|false
$filename :要計算的文件路徑。
$binary :是否以原始二進制格式返回哈希(默認為false ,返回32位的十六進製字符串)。
示例:
$hash = md5_file('example.txt');
echo $hash;
我們將工具設計成兩個階段:
生成基準校驗碼(基線) :記錄所有待監測文件的MD5值,並保存到一個JSON文件中。
定期檢測:重新計算當前文件的MD5值,與基線文件對比,判斷是否被修改、刪除或新增。
function generateBaseline($dir, $baselineFile = 'baseline.json') {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
$hashes = [];
foreach ($files as $file) {
if ($file->isFile()) {
$path = str_replace('\\', '/', $file->getRealPath());
$hashes[$path] = md5_file($path);
}
}
file_put_contents($baselineFile, json_encode($hashes, JSON_PRETTY_PRINT));
echo "基線文件已生成: {$baselineFile}\n";
}
// 用法示例
generateBaseline(__DIR__ . '/files');
該函數會遞歸掃描files目錄下的所有文件,並將每個文件的完整路徑及其MD5值寫入baseline.json中。
function checkIntegrity($dir, $baselineFile = 'baseline.json') {
if (!file_exists($baselineFile)) {
echo "找不到基線文件,請先生成基線。\n";
return;
}
$baseline = json_decode(file_get_contents($baselineFile), true);
$current = [];
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($files as $file) {
if ($file->isFile()) {
$path = str_replace('\\', '/', $file->getRealPath());
$current[$path] = md5_file($path);
}
}
// 檢測被修改或刪除的文件
foreach ($baseline as $path => $hash) {
if (!isset($current[$path])) {
echo "[刪除] {$path}\n";
} elseif ($current[$path] !== $hash) {
echo "[修改] {$path}\n";
}
}
// 檢測新增的文件
foreach ($current as $path => $hash) {
if (!isset($baseline[$path])) {
echo "[新增] {$path}\n";
}
}
}
// 用法示例
checkIntegrity(__DIR__ . '/files');
這個檢測腳本將新舊哈希進行對比,輸出每個被修改、新增或刪除的文件路徑,便於開發人員及時採取措施。
可以將檢測結果通過郵件、日誌文件或者網頁端展示出來。例如:
file_put_contents('integrity_report.log', $report);
header('Location: https://m66.net/report-viewer');
上面的代碼將檢測報告記錄到日誌文件後重定向到一個報告查看器頁面,比如https://m66.net/report-viewer 。
通過md5_file()函數,我們可以用極少的代碼構建一個高效的文件完整性檢測工具。雖然它不能替代專業的安全防護工具,但對於中小型網站而言,已經足夠應對常見的篡改風險。在實際部署中,建議將該腳本作為Cron任務定時運行,並結合通知機制(如郵件或釘釘機器人)進一步提高安全性。