Schlüsselpunkte
hash_file()
-Funktion kann verwendet werden, um eine Dateistrukturkonfigurationsdatei zur Überwachung zu erstellen. Der Hash -Wert jeder Datei kann für spätere Vergleiche gespeichert werden, um Änderungen zu erkennen. file_path
den Pfad der Datei auf dem Server speichert und file_hash
den Hash -Wert einer Datei speichert. RecursiveDirectoryIterator
-Klass kann verwendet werden, um den Dateibaum zu durchqueren und Hashes zum Vergleich zu sammeln. Die integrity_hashes
-Datenbank kann dann mit diesen Hashes aktualisiert werden. Die array_diff_assoc()
-Funktion von PHP kann verwendet werden, um Unterschiede zu überprüfen, mit denen Dateien identifiziert wurden, die hinzugefügt, gelöscht oder geändert wurden. Arbeiten Sie in verschiedenen Situationen im Website -Management
zusammen.
, was noch wichtiger ist, wissen Sie, ob einer davon passiert? Wenn Ihre Antwort Nein lautet, lesen Sie bitte weiter. In diesem Handbuch werde ich demonstrieren, wie Sie eine Dateistrukturkonfigurationsdatei erstellen, mit der die Integrität der Datei überwacht werden kann. hash_file()
-Funktion zu verwenden. Es bietet eine Vielzahl verschiedener Hashing -Algorithmen, mit denen mein Code einfach zu ändern ist, wenn ich mich später entscheide, ihn später zu ändern. Hash wird in einer Vielzahl von Anwendungen verwendet, vom Kennwortschutz bis zur DNA -Sequenzierung. Der Hashing-Algorithmus funktioniert, indem Daten in eine wiederholbare verschlüsselte Zeichenfolge mit fester Größe konvertiert werden. Sie sind so konzipiert, dass selbst geringfügige Modifikationen an den Daten sehr unterschiedliche Ergebnisse erzielen sollten. Wenn zwei oder mehr verschiedene Daten das gleiche Zeichenfolgenergebnis erzielen, wird sie als "Konflikt" bezeichnet. Die Stärke jedes Hashing -Algorithmus kann anhand seiner Geschwindigkeit und Wahrscheinlichkeit der Kollision gemessen werden. In meinem Beispiel werde ich den SHA-1-Algorithmus verwenden, da er schnell ist, eine geringe Konfliktwahrscheinlichkeit hat und weit verbreitet und vollständig getestet wurde. Natürlich können Sie gerne andere Algorithmen recherchieren und jeden Algorithmus verwenden, den Sie mögen. Nach dem Erhalt des Hash -Werts der Datei kann er für einen späteren Vergleich gespeichert werden. Wenn die Datei -Hashing später nicht dieselbe Hash -Zeichenfolge wie zuvor zurückgibt, wissen wir, dass die Datei geändert wurde.
DatenbankErstens müssen wir eine Basistabelle layout, um den Hash -Wert der Datei zu speichern. Ich werde das folgende Muster verwenden:
CREATE TABLE integrity_hashes ( file_path VARCHAR(200) NOT NULL, file_hash CHAR(40) NOT NULL, PRIMARY KEY (file_path) );
file_path
Der Pfad zur Datei auf dem Speicherserver, da der Wert immer eindeutig ist (da zwei Dateien im Dateisystem nicht denselben Speicherort belegen), ist dies unser Hauptschlüssel. Ich habe seine maximale Länge auf 200 Zeichen angegeben, was einige längere Dateipfade ermöglichen sollte. file_hash
speichert den Hash-Wert der Datei, der eine SHA-1 40-Charakter-Hexadezimalzeichenfolge ist.
sammeln Sie Dateien
Der nächste Schritt besteht darin, die Konfigurationsdatei für die Dateistruktur zu erstellen. Wir definieren den Pfad, Dateien zu sammeln und jedes Verzeichnis rekursiv zu iterieren, bis wir den gesamten Zweig des Dateisystems überschreiben und bestimmte Verzeichnisse oder Dateierweiterungen optional ausschließen können. Wir sammeln die erforderlichen Hash -Werte, wenn sie den Dateibaum durchqueren und dann in der Datenbank oder zum Vergleich speichern. PHP bietet verschiedene Möglichkeiten, den Dateibaum zu durchqueren. RecursiveDirectoryIterator
<?php define("PATH", "/var/www/"); $files = array(); // 要获取的扩展名,空数组将返回所有扩展名 $ext = array("php"); // 要忽略的目录,空数组将检查所有目录 $skip = array("logs", "logs/traffic"); // 构建配置文件 $dir = new RecursiveDirectoryIterator(PATH); $iter = new RecursiveIteratorIterator($dir); while ($iter->valid()) { // 跳过不需要的目录 if (!$iter->isDot() && !in_array($iter->getSubPath(), $skip)) { // 获取特定文件扩展名 if (!empty($ext)) { // PHP 5.3.4: if (in_array($iter->getExtension(), $ext)) { if (in_array(pathinfo($iter->key(), PATHINFO_EXTENSION), $ext)) { $files[$iter->key()] = hash_file("sha1", $iter->key()); } } else { // 忽略文件扩展名 $files[$iter->key()] = hash_file("sha1", $iter->key()); } } $iter->next(); }
-Array bezog. Nur weil ich mich entschlossen habe, ein bestimmtes Verzeichnis zu ignorieren, heißt das nicht, dass der Iterator je nach Ihren Bedürfnissen auch alle Subdirektoren ignoriert, was nützlich oder ärgerlich sein kann. Die $skip
Klasse gibt uns Zugriff auf mehrere Methoden: logs
RecursiveDirectoryIterator
valid()
isDot()
getSubPath()
key()
next()
gemacht habe. Nach der Ausführung sollte der Code das getExtension()
-Array mit ähnlichen Ergebnissen ausfüllen wie: pathinfo()
$files
<code>Array ( [/var/www/test.php] => b6b7c28e513dac784925665b54088045cf9cbcd3 [/var/www/sub/hello.php] => a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa [/var/www/sub/world.php] => da39a3ee5e6b4b0d3255bfef95601890afd80709 )</code>
<?php $db = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD); // 清除旧记录 $db->query("TRUNCATE integrity_hashes"); // 插入更新的记录 $sql = "INSERT INTO integrity_hashes (file_path, file_hash) VALUES (:path, :hash)"; $sth = $db->prepare($sql); $sth->bindParam(":path", $path); $sth->bindParam(":hash", $hash); foreach ($files as $path => $hash) { $sth->execute(); }
Sie wissen nun, wie Sie eine neue Konfigurationsdatei für die Verzeichnisstruktur erstellen und die Datensätze in der Datenbank aktualisieren. Der nächste Schritt besteht darin, es zu einer echten Anwendung zu kombinieren, wie z. B. einen Cron -Job mit E -Mail -Benachrichtigungen, einer Administratorschnittstelle oder irgendetwas anderem, das Sie mögen. Wenn Sie nur eine Liste geänderter Dateien sammeln möchten, ohne sich darum zu kümmern, wie sie sich ändern, ist es am einfachsten, die Daten aus der Datenbank in ein Array zu extrahieren, das der
ähnlich ist, und die -Funktion von PHP verwenden, um unerwünschte Inhalte zu entfernen. $files
CREATE TABLE integrity_hashes ( file_path VARCHAR(200) NOT NULL, file_hash CHAR(40) NOT NULL, PRIMARY KEY (file_path) );
In diesem Beispiel wird $diffs
mit allen gefundenen Unterschieden bevölkert, oder wenn die Dateistruktur abgeschlossen ist, ist es ein leeres Array. Im Gegensatz zu array_diff()
verwendet array_diff_assoc()
den Schlüssel im Vergleich, was im Konflikt wichtig ist, z. B. zwei leere Dateien haben den gleichen Hash -Wert. Wenn Sie noch einen Schritt weiter gehen möchten, können Sie eine einfache Logik hinzufügen, um genau zu bestimmen, wie die Datei betroffen ist, unabhängig davon, ob sie gelöscht, geändert oder hinzugefügt wird.
<?php define("PATH", "/var/www/"); $files = array(); // 要获取的扩展名,空数组将返回所有扩展名 $ext = array("php"); // 要忽略的目录,空数组将检查所有目录 $skip = array("logs", "logs/traffic"); // 构建配置文件 $dir = new RecursiveDirectoryIterator(PATH); $iter = new RecursiveIteratorIterator($dir); while ($iter->valid()) { // 跳过不需要的目录 if (!$iter->isDot() && !in_array($iter->getSubPath(), $skip)) { // 获取特定文件扩展名 if (!empty($ext)) { // PHP 5.3.4: if (in_array($iter->getExtension(), $ext)) { if (in_array(pathinfo($iter->key(), PATHINFO_EXTENSION), $ext)) { $files[$iter->key()] = hash_file("sha1", $iter->key()); } } else { // 忽略文件扩展名 $files[$iter->key()] = hash_file("sha1", $iter->key()); } } $iter->next(); }
Wenn wir die Ergebnisse in der Datenbank durchqueren, führen wir mehrere Überprüfungen durch. Verwenden Sie zunächst array_key_exists()
, um zu überprüfen, ob der Dateipfad in unserer Datenbank in $files
angezeigt wird. Wenn nicht, muss die Datei gelöscht worden sein. Zweitens, wenn die Datei vorhanden ist, der Hash nicht übereinstimmt, muss die Datei geändert oder nicht geändert worden sein. Wir speichern jede Überprüfung in ein temporäres Array namens $tmp
. Wenn die Nummer in $files
größer als die Zahl in der Datenbank ist, wissen wir, dass die verbleibenden nicht überprüften Dateien hinzugefügt wurden. Sobald $diffs
entweder ein leeres Array ist oder alle Unterschiede in Form eines mehrdimensionalen Arrays enthält, das so aussehen könnte:
<code>Array ( [/var/www/test.php] => b6b7c28e513dac784925665b54088045cf9cbcd3 [/var/www/sub/hello.php] => a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa [/var/www/sub/world.php] => da39a3ee5e6b4b0d3255bfef95601890afd80709 )</code>
Um die Ergebnisse in einem benutzerfreundlicheren Format (z. B. der Verwaltungsschnittstelle) anzuzeigen, können Sie beispielsweise die Ergebnisse iterieren und sie als Bulleted-Listen ausgeben.
<?php $db = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD); // 清除旧记录 $db->query("TRUNCATE integrity_hashes"); // 插入更新的记录 $sql = "INSERT INTO integrity_hashes (file_path, file_hash) VALUES (:path, :hash)"; $sth = $db->prepare($sql); $sth->bindParam(":path", $path); $sth->bindParam(":hash", $hash); foreach ($files as $path => $hash) { $sth->execute(); }
Zu diesem Zeitpunkt können Sie einen Link zur Verfügung stellen, um den Betrieb der Aktualisierung der Datenbank mit der neuen Dateistruktur auszulösen (in diesem Fall können Sie $files
in einer Sitzungsvariablen speichern) oder wenn Sie die Unterschiede nicht genehmigen, können Sie sie bei Bedarf verarbeiten.
Zusammenfassung
Ich hoffe, dieser Leitfaden hilft Ihnen dabei, die Überwachung der Dateiintegrität besser zu verstehen. Die Installation solcher Inhalte auf Ihrer Website ist eine wertvolle Sicherheitsmaßnahme, und Sie können sicher sein, dass Ihre Dateien mit Absicht gleich bleiben. Vergessen Sie natürlich nicht, regelmäßig zu sichern. falls.
(Der FAQ-Teil des Originaltext
Das obige ist der detaillierte Inhalt vonPHP Master | Überwachungsdateiintegrität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!