Czasem się zdarza, że przez dziurawy CMS, wyciek haseł przez dziury w klientach FTP do wielu plików dokleja się złośliwy kod (wysyłający maile, przekierowujący na inne strony etc.). Ręczna edycja nie wchodzi w grę przy setkach, tysiącach plików. Podmiana plików na świeże często też nie wchodzi w grę ze względu na stratę wprowadzonych zmian bądź po prostu braku czystych plików źródłowych. Mam rozwiązanie w postaci prostej, efektywnej klasy PHP!
Skrypt jest bardzo prosty, kilka linijek kodu załatawia sprawę – wykonanie przy 3 tysiącach plików trwa… 3 sekundy, czyli średnio wydajność 1000 plików na sekundę. Wykonanie kodu dla serwera nie jest wielkim wyzwaniem.
GOTOWA KLASA:
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 | class CzyscPliki { public $dir; public $wyrzuc; public function wykonaj($dir,$wyrzuc){ $lista_pliki = scandir($dir); echo '<ol>'; foreach($lista_pliki as $plik){ if($plik != '.' && $plik != '..'){ echo '<li>' . $plik; if(is_dir($dir . '/' . $plik)) $this->wykonaj($dir . '/' . $plik, $wyrzuc); echo '</li>'; $this->podmien($dir . '/' . $plik, $wyrzuc); } } echo '</ol>'; } public function podmien ($plik,$to_wyrzuc) { $tu = file_get_contents($plik); $go = str_replace($to_wyrzuc,'',$tu); file_put_contents($plik,$go); } } |
Szybki opis: klasa tworzy najpierw listę wszystkich dostępnych katalogów i plików (oczywiście podąża w głąb struktury katalogów listując wszystkie pliki). Następnie dla każdego pliku wykonuje funkcję „podmień” – zamienia podany ciąg znaków na pusty i zapisuje zmieniony plik. Jedym słowem usuwa złośliwy kod.
Wykorzystanie klasy:
1 2 | $wywal = new CzyscPliki; $wywal->wykonaj('.','<?php echo /'Jestem złośliwym kodem!/'; ?>'); |
Pierwszym argumentem jest ścieżka od której ma się rozpocząć listowanie plików. Kropka oznacza, że listowanie ma się zacząć od katalogu, w którym znajduje się plik z wywołaniem klasy. Można dowolnie zmienić ten argument na katalog np.:
1 2 | $wywal = new CzyscPliki; $wywal->wykonaj('wp-content/themes','<?php echo /'Jestem złośliwym kodem!/'; ?>'); |
Drugi argument to kod, który zostanie usunięty. Pamiętaj, aby wszystkie znaki apostrofu złośliwego kodu (’) poprzedzić w argumencie backslashem: (\) – dokładnie tak jak na przykłazie. W przeciwym wypadku kod PHP nie będzie się wykonywał (błąd składni). Można łatwo podmienić wszystkie występujące znaki apostrofu na przykład programem notepad++.
Coś nie działa mi to, biała strona. Coś trzeba dopisać aby to się wykonywało ??
wykonaj(’.’,”);
?>
Coś mi tu jeszcze brakuje ?? hmm ?
Najlepiej wrzuć kod na jakiś pastebin czy coś w tym stylu, ewentualnie daj na początek za znacznik <?php
error_reporting(0);
i zobacz co się dzieje.
A mógłbyś napisać, jak to w praktyce zrobić, krok po kroku? Dla zielonych?
Wydaje się być pomocny tylko gdzie to umiescić?
Np tak:
Tworzysz na serwerze w katalogu publicznym plik czysc.php, wklejasz doniego kod „GOTOWA KLASA” (oczywiście musi się rozpoczynać znacznikiem
Następnie przed tą całą klasę, ale po znaczniku