Heim > Backend-Entwicklung > PHP-Tutorial > PHP Master | Überwachungsdateiintegrität

PHP Master | Überwachungsdateiintegrität

Christopher Nolan
Freigeben: 2025-03-03 08:26:13
Original
998 Leute haben es durchsucht

PHP Master | Monitoring File Integrity

Schlüsselpunkte

  • Überwachungsdateiintegrität ist für das Website -Management von wesentlicher Bedeutung und hilft zu erkennen, wann Dateien hinzugefügt, geändert, gelöscht oder von böswillig beschädigt werden. Das Hischen des Inhalts einer Datei ist eine zuverlässige Möglichkeit, solche Änderungen zu überwachen.
  • PHPs 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.
  • Sie können eine Datenbanktabelle festlegen, um den Hash -Wert einer Datei zu speichern, wobei file_path den Pfad der Datei auf dem Server speichert und file_hash den Hash -Wert einer Datei speichert.
  • PHPs 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.

    Überlegen Sie, wie Sie bei der Verwaltung einer Website die folgenden Situationen lösen können:
  • versehentlich Hinzufügen, Ändern oder Löschen von Dateien
  • bösartig hinzufügen, ändern oder löschen Sie Dateien
Dateien sind beschädigt

, 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()

Der beste Weg, um festzustellen, ob eine Datei geändert wurde, besteht darin, ihren Inhalt zu hassten. PHP liefert mehrere Hash -Funktionen, aber für dieses Projekt habe ich beschlossen, die

-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.

Datenbank

Erstens 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)
);
Nach dem Login kopieren
Nach dem Login kopieren

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();
}
Nach dem Login kopieren
Nach dem Login kopieren
Beachten Sie, dass ich denselben Ordner zweimal im

-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

    Überprüfen Sie, ob wir gültige Dateien
  • verwenden valid()
  • Bestimmen Sie, ob das Verzeichnis "oder" .. "
  • ist isDot()
  • kehren Sie zum Ordnernamen zurück, in dem sich der Dateizeiger derzeit
  • befindet getSubPath()
  • Gibt den vollständigen Pfad und den Dateinamen
  • zurück key()
  • starten Sie die Schleife
  • neu next()
  • Es sind noch viele weitere Methoden verfügbar, aber die oben aufgeführte Methoden sind jedoch die benötigten Methoden, obwohl die
-Methode in Php 5.3.4 hinzugefügt wurde, wodurch die Dateierweiterung zurückgegeben wird. Wenn Ihre PHP -Version es unterstützt, können Sie sie verwenden, um unerwünschte Einträge anstelle dessen zu filtern, anstatt das, was ich mit

gemacht habe. Nach der Ausführung sollte der Code das getExtension() -Array mit ähnlichen Ergebnissen ausfüllen wie: pathinfo() $files

Nach dem Erstellen der Konfigurationsdatei ist es sehr einfach, die Datenbank zu aktualisieren.
<code>Array
(
    [/var/www/test.php] => b6b7c28e513dac784925665b54088045cf9cbcd3
    [/var/www/sub/hello.php] => a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa
    [/var/www/sub/world.php] => da39a3ee5e6b4b0d3255bfef95601890afd80709
)</code>
Nach dem Login kopieren
Nach dem Login kopieren

<?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();
}
Nach dem Login kopieren
Nach dem Login kopieren
Überprüfen Sie die Differenz

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)
);
Nach dem Login kopieren
Nach dem Login kopieren

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();
}
Nach dem Login kopieren
Nach dem Login kopieren

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>
Nach dem Login kopieren
Nach dem Login kopieren

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();
}
Nach dem Login kopieren
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage