Fehlerbehebung
auto_prepend_file und auto_append_file
auto_prepend_file legt eine Datei fest, die PHP mit einer Operation ähnlich wie require vor der Hauptdatei lädt. auto_append_file macht dasselbe nach der Hauptdatei, außer wenn die Ausführung mit exit() endet. Beide Direktiven verwenden include_path.
Sie entsprechen nicht include, require oder dem Autoload von Composer: Sie werden aus der PHP-Konfiguration angewendet und können alle Ausführungen betreffen, für die diese Konfiguration gilt.
Die Firewall von Wordfence kann zum Beispiel auto_prepend_file nutzen, um Anfragen zu filtern, bevor WordPress geladen wird. Prüfen Sie den aktuellen Wert, bevor Sie ihn ändern: Wenn Sie ihn durch ein Diagnoseskript ersetzen, läuft dieser Schutz möglicherweise nicht mehr.
Bei einer erneuten Infektion beginnen Sie mit der engsten Diagnosequelle: Uhrzeit und Pfad aus dem Sicherheitsverlauf, die Zeitstempel und Änderungen der betroffenen Datei sowie die Zugriffs- und Sicherheitsprotokolle in diesem Zeitraum.
Eine zeitlich nahe POST-Anfrage ist nur ein Kandidat: Sie beweist nicht, dass diese Anfrage die Datei geändert hat, und zeigt nicht, welches Plugin die Anfrage verarbeitet hat. In WordPress können mehrere Komponenten Anfragen über index.php, admin-ajax.php oder die REST-API erhalten.
Nur wenn sich die Ausführung mit diesen Quellen nicht nachverfolgen lässt, kann auto_prepend_file vorübergehend genutzt werden, um bestimmte Metadaten künftiger Anfragen zu protokollieren. Protokollieren Sie nie den vollständigen POST-Body.
Schritt für Schritt
Legen Sie zuerst /home/CPANEL_USUARIO/private mit den Rechten 0700 an. Erstellen Sie dann außerhalb von public_html die Datei /home/CPANEL_USUARIO/private/request-debug.php mit folgendem Inhalt und passen Sie action, plugin und event an die einzigen Felder an, die Sie für die Untersuchung brauchen:
<?php (function (): void { $logFile = '/home/CPANEL_USUARIO/private/request-debug.log'; if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') { return; } clearstatcache(true, $logFile); $logSize = is_file($logFile) ? filesize($logFile) : 0; if (is_int($logSize) && $logSize >= 5 * 1024 * 1024) { return; } $selectedFields = []; foreach (['action', 'plugin', 'event'] as $field) { if (isset($_POST[$field]) && is_scalar($_POST[$field])) { $selectedFields[$field] = substr((string) $_POST[$field], 0, 200); } } $entry = [ 'time' => date(DATE_ATOM), 'method' => $_SERVER['REQUEST_METHOD'], 'path' => parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH), 'fields' => $selectedFields, ]; $encoded = json_encode( $entry, JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE ); if (is_string($encoded)) { $previousMask = umask(0077); try { if (file_put_contents($logFile, $encoded.PHP_EOL, FILE_APPEND | LOCK_EX) !== false) { chmod($logFile, 0600); } } finally { umask($previousMask); } } })();
Ersetzen Sie CPANEL_USUARIO durch Ihren cPanel-Benutzer.
Dieses Skript speichert nur Pfad, Methode und die ausgewählten Felder und prüft vor dem Schreiben eine Schwelle von 5 MiB. Das ist keine harte Grenze: Gleichzeitige Anfragen oder der letzte Eintrag können sie überschreiten. Prüfen Sie die Größe während des Diagnosezeitraums. Fügen Sie keine Felder für Passwörter, Autorisierung, Cookies, Tokens, personenbezogene Daten oder Zahlungen hinzu; wenn ein legitimer Wert sensible Informationen enthalten kann, schwärzen Sie ihn oder ersetzen Sie ihn vor dem Protokollieren durch einen Hash. Skript und Protokoll müssen dem cPanel-Benutzer gehören, und das Protokoll muss die Rechte 0600 behalten.
Dieses Protokoll liefert nur Metadaten, um eine Kandidaten-Anfrage zuzuordnen. Es beweist nicht, dass diese Anfrage die Änderung verursacht hat, und ist kein manipulationssicherer Nachweis: Ein Angreifer mit Schreibzugriff auf dasselbe Konto könnte es verändern oder deaktivieren.
Fügen Sie danach ganz am Anfang der Datei .htaccess in public_html Folgendes ein:
php_value auto_prepend_file '/home/CPANEL_USUARIO/private/request-debug.php'
Ersetzen Sie auch hier den cPanel-Benutzer durch Ihren eigenen. Die Direktive betrifft die PHP-Ausführungen, für die diese .htaccess gilt, normalerweise auch in ihren Unterverzeichnissen. Testen Sie das Skript zuerst mit derselben PHP-Version, die die Website nutzt.
Wenn nach dem Hinzufügen von php_value ein Fehler 500 erscheint, entfernen Sie die Zeile sofort und sehen Sie im Fehlerprotokoll nach. Nur eine Meldung, die die Direktive als ungültig oder nicht erlaubt ausweist, bestätigt, dass der Handler ihre Konfiguration über .htaccess nicht zulässt.
Legen Sie vor Beginn ein kurzes Erfassungsfenster und eine Maximalgröße fest. Entfernen Sie danach sofort die Zeile
auto_prepend_file, löschen Sierequest-debug.phpund vernichten Sie das Protokoll, sobald die Nachweise nicht mehr gebraucht werden. Solange Sie es aufbewahren, beschränken Sie den Zugriff auf die Personen, die die Analyse durchführen, und legen Sie eine ausdrückliche Aufbewahrungsfrist fest; speichern Sie es nicht unbegrenzt.
Diese Erfassung ersetzt nicht die Reaktion auf den Vorfall. Auch wenn sie eine Anfrage mit einer Änderung in Verbindung bringt, müssen Sie noch bestätigen, welcher Code sie verarbeitet hat, den Einstiegsweg schließen, Persistenzmechanismen prüfen, Komponenten aus vertrauenswürdigen Quellen neu installieren, betroffene Zugangsdaten ändern und prüfen, dass keine weiteren Dateien oder Benutzer verändert wurden.
Bewahren Sie den bisherigen Wert von auto_prepend_file auf und stellen Sie ihn am Ende wieder her. Wenn eine Firewall ihn verwaltet, ersetzen Sie ihn nicht, ohne in einer Testkopie eine kompatible Integration vorzubereiten. Prüfen Sie auch, dass weder der Pfad selbst noch die ausgewählten Felder personenbezogene Kennungen enthalten; lassen Sie alle Daten weg, die Sie nicht brauchen. Das Beispiel stellt die Rechtemaske nach dem Schreiben wieder her, damit sich nicht ändert, wie die Anwendung ihre eigenen Dateien anlegt.
Das könnte Ihnen auch helfen
- Fehler in PHP-Anwendungen oder -Dateien debuggen Diagnostizieren Sie eine weiße Seite oder einen Fehler 500, indem Sie den Fehler nachstellen und zue...
- PHP-Fehler für eine bestimmte Datei protokollieren Erfassen Sie die Fehler einer einzelnen PHP-Datei in einem privaten, vorübergehenden Protokoll und l...
- PHP-Fehlerprotokoll in cPanel aktivieren Aktivieren Sie log_errors vorübergehend für die tatsächlich genutzte Version im PHP-Selektor von cPa...
- PHP-Fehlerprotokoll über die Datei .htaccess aktivieren Konfigurieren Sie .htaccess so, dass PHP-Fehler vorübergehend außerhalb von public_html protokollier...
Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.