ファイルの整合性を確保することは、多数のローカルファイル(ソフトウェア配信パッケージ、ドキュメント、メディアリソースなど)を管理する際に非常に重要なステップです。効果的な方法は、各ファイルのMD5署名を生成し、その後のチェックサム変更検出のためにデータベースに保存することです。 PHPは非常に便利な機能を提供します-MD5_FILE()は、ファイルのMD5チェックサムを直接返すことができます。
この記事では、md5_file()を使用してローカルファイルの署名を生成し、完全なファイル検証データベースを作成する方法を紹介します。
開始する前に、サーバーまたは開発環境にPHPがインストールされ、ファイルシステムアクセスがあることを確認してください。シンプルなPHPスクリプトを例として使用して、ディレクトリ内のすべてのファイルを再帰的にスキャンし、MD5署名を生成し、データベースに保存します。
以下は、PDOを使用してSQLiteデータベースに書き込む完全なサンプルスクリプトです。必要に応じて、MySQL、PostgreSQL、およびその他のデータベースに置き換えることもできます。
<?php
$directory = __DIR__ . '/files';
$dbFile = __DIR__ . '/checksum.db';
$pdo = new PDO('sqlite:' . $dbFile);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// データベースを初期化します
$pdo->exec("CREATE TABLE IF NOT EXISTS file_checksums (
id INTEGER PRIMARY KEY AUTOINCREMENT,
path TEXT UNIQUE,
md5 TEXT,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)");
// ディレクトリをスキャンして、ファイルを処理します
function scanFiles($dir, $pdo) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($files as $file) {
if ($file->isFile()) {
$path = $file->getRealPath();
$md5 = md5_file($path);
$stmt = $pdo->prepare("INSERT INTO file_checksums (path, md5)
VALUES (:path, :md5)
ON CONFLICT(path) DO UPDATE SET md5 = :md5, updated_at = CURRENT_TIMESTAMP");
$stmt->execute([
':path' => $path,
':md5' => $md5,
]);
echo "処理:$path\n";
}
}
}
scanFiles($directory, $pdo);
echo "ファイルの署名生成が完了します。\n";
その後、スクリプトを再度実行でき、データベースに既に存在するファイルレコードを自動的に更新します。独立した検証スクリプトを作成して、現在のファイルのMD5がデータベースに記録されたMD5値と一致しているかどうかを比較することもできます。
<?php
$directory = __DIR__ . '/files';
$dbFile = __DIR__ . '/checksum.db';
$pdo = new PDO('sqlite:' . $dbFile);
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
foreach ($files as $file) {
if ($file->isFile()) {
$path = $file->getRealPath();
$currentMd5 = md5_file($path);
$stmt = $pdo->prepare("SELECT md5 FROM file_checksums WHERE path = :path");
$stmt->execute([':path' => $path]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row) {
if ($row['md5'] !== $currentMd5) {
echo "ファイルが変更されました:$path\n";
}
} else {
echo "新しいファイル:$path\n";
}
}
}
許可制御:ファイルとデータベースの読み取りおよび書き込み許可が正しく構成されていることを確認してください。
定期的な実行:署名アップデートまたは検証スクリプトは、Cronタイミングタスクを介して定期的に実行できます。
リモート検証:ファイルの整合性をリモートで確認する必要がある場合は、インターフェイスを介して生成された署名をサーバーにアップロードできます(<code> https://m66.net/api/upload_md5 </code>など)。
MD5_FILE()とデータベースストレージを組み合わせることにより、効率的で安定したファイルの整合性検証メカニズムを簡単に構築できます。この方法は、ローカルファイルの監視、システムセキュリティ監査、展開自動化、その他のシナリオに適しており、システムの信頼性とトレーサビリティを効果的に改善します。