毎日のウェブサイトの開発と運用とメンテナンスでは、ファイルの完全性はシステムセキュリティの重要な部分です。ファイルが改ざんされると、システムが攻撃されたか、データが侵害されたことを意味する場合があります。この状況に対処するために、PHPの組み込みMD5_FILE()関数を使用して、シンプルで実用的なファイル整合性検出ツールを構築できます。
MD5_FILE()は、指定されたファイルのMD5ハッシュ値を直接計算するためにPHPによって提供される関数です。基本的な構文は次のとおりです。
md5_file(string $filename, bool $binary = false): string|false
$ filename :計算するファイルパス。
$ binary :元のバイナリ形式でハッシュを返すかどうか(デフォルトはfalseで、32ビットヘキサデシマル文字列を返します)。
例:
$hash = md5_file('example.txt');
echo $hash;
2つの段階でツールを設計しました。
ベンチマーク検証コード(ベースライン)の生成:監視するすべてのファイルの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');
この関数は、ファイルディレクトリ内のすべてのファイルを再帰的にスキャンし、各ファイルのフルパスとその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');
この検出スクリプトは、古いハッシュと新しいハッシュを比較し、変更、追加、または削除された各ファイルパスを出力して、開発者がタイムリーな測定を受けることができるようにします。
テスト結果は、電子メール、ログファイル、またはWebページから表示できます。例えば:
file_put_contents('integrity_report.log', $report);
header('Location: https://m66.net/report-viewer');
上記のコードは、検出レポートをログファイルにリダイレクトし、 https://m66.net/report-viewerなどのレポートビューアーページにリダイレクトします。
MD5_File()関数を介して、コードがほとんどない効率的なファイル整合性検出ツールを構築できます。専門的なセキュリティ保護ツールを置き換えることはできませんが、中小のウェブサイトが一般的な改ざんリスクに対処するだけで十分です。実際の展開では、スクリプトを定期的にCRONタスクとして実行し、通知メカニズム(電子メールやDingTalkロボットなど)と組み合わせてセキュリティをさらに改善することをお勧めします。