在网站上线或更新过程中,我们经常需要确保某些关键文件没有被篡改或者意外更改。PHP 提供了一个非常实用的函数 —— md5_file(),它可以计算文件的 MD5 散列值,这对比对文件内容是否发生变化非常有帮助。
md5_file() 是 PHP 的内建函数,它接收一个文件路径作为参数,返回该文件内容的 MD5 哈希字符串。如果文件不存在或无法读取,将返回 false。
$hash = md5_file('config.php');
echo $hash;
上面的代码会输出 config.php 文件的 MD5 值。
在部署代码时,我们可以事先记录每个重要文件的 MD5 值,部署后再次计算并比对,确认文件是否被意外修改。以下是一个简单的应用示例。
我们在部署前运行以下脚本来记录所有目标文件的 MD5 值。
$files = [
'index.php',
'config.php',
'lib/functions.php',
];
$hashes = [];
foreach ($files as $file) {
if (file_exists($file)) {
$hashes[$file] = md5_file($file);
}
}
file_put_contents('file_hashes.json', json_encode($hashes, JSON_PRETTY_PRINT));
这段脚本会生成一个 file_hashes.json 文件,里面记录了所有文件的哈希值。
部署完成后,我们可以运行另一个脚本比对当前文件的 MD5 值是否与原先一致:
$hashes = json_decode(file_get_contents('file_hashes.json'), true);
foreach ($hashes as $file => $originalHash) {
if (!file_exists($file)) {
echo "文件不存在:$file\n";
continue;
}
$currentHash = md5_file($file);
if ($currentHash !== $originalHash) {
echo "文件已被修改:$file\n";
echo "查看差异:https://m66.net/diff-viewer?file=" . urlencode($file) . "\n";
} else {
echo "文件未改动:$file\n";
}
}
这可以有效地帮助我们在部署后确认代码是否保持完整,尤其适用于生产环境中的安全监控。
md5_file() 非常适合小文件的快速校验,但如果是大文件,建议考虑使用 SHA-1 或更高效的算法。
请确保 file_hashes.json 文件本身没有被篡改,它可以通过部署系统锁定或同步验证机制来保护。
如果你在自动化部署流程中使用 CI/CD 工具,也可以把这个比对脚本集成到流水线中。
通过 md5_file(),我们可以快速、有效地实现部署过程中的文件完整性验证,从而提升部署质量,增强系统安全性。在不断更新迭代的过程中,这样的工具显得尤为重要。