Unerwünschten Code finden und entfernen
Dieses PHP-Script habe ich geschrieben, um Code aus Dateien, die auf einem Webserver liegen, zu entfernen.
Der Grund war, dass ein FTP-Account gehackt wurde und in sämtliche PHP- und HTML-Dateien ein Schadcode eingefügt wurde. Nun wäre es sehr mühsam gewesen, diesen Code von Hand zu entfernen. Von Hand kann diese Codeentfernung extrem lange dauern.
Das Script wird über den Webbrowser aufgerufen und arbeitet sich aus dem Verzeichnis, in dem es liegt, durch alle Unterverzeichnisse. Es öffnet in jedem Verzeichnis die Dateien, sucht nach dem Code und entfernt diesen. Danach wird die Datei wieder abgespeichert. Voraussetzung sind natürlich entsprechende Schreibrechte.
Ich empfehle vor der Ausführung, ein Backup der Dateien anzulegen, denn man kann das nicht rückgängig machen.
Script Codeentfernung:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php function dir_rekursiv($verzeichnis) { $handle = opendir($verzeichnis); while ($datei = readdir($handle)) { if ($datei != "." && $datei != "..") { if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist { // Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen. dir_rekursiv($verzeichnis.$datei.'/'); } else { // Wenn der Verzeichnis-Eintrag eine Datei ist, diese ausgeben und bearbeiten. $file = "./".$verzeichnis.$datei; $subject = file_get_contents($file); //Die Datei lesen und den Inhalt in $subject schreiben. $tag1 = '0c0896--'; //Suchterm Beginn $tag2 = '0c0896--'; //Suchterm Ende $subject = preg_replace("#<!--".$tag1.".*<!--/".$tag2."-->#Uis", "", $subject); //in HTML/PHP <!--.tag1 .* <!--/.tag2 .> //das heisst: <!--0c0896-- egal was dann kommt (*) bis <!--/0c0896--> wird entfernt file_put_contents($file, $subject); //die Datei wieder schreiben echo $verzeichnis.$datei.'<br>'; } } } closedir($handle); } //hier das zu durchsuchende Verzeichnis angeben dir_rekursiv('verzeichnis'.'/'); ?> |
Das Script kann auch genutzt werden, um eine “Suchen/Ersetzen”-Funktion auszuführen. Dazu muss nur Zeile 21 angepasst werden:
1 | $subject = str_replace("Das soll weg", "und dadurch ersetzt werden", $subject); |
Hier sollte die Funktion str_replace() verwendet werden, denn diese ist der preg_replace() vorzuziehen, wenn keine ausgefallenen Ersetzungsregeln (wie reguläre Ausdrücke) genutzt werden.
Zeile 19 und 20 sind dann natürlich “überflüssig”.