Jak monitorować zmiany w plikach WordPress (wykrywanie infekcji i modyfikacji)

WordPress jest jednym z najpopularniejszych systemów CMS na świecie, a jego otwartość i elastyczność idą w parze z podatnością na ataki. Jednym z kluczowych elementów ochrony jest monitorowanie zmian w plikach – dzięki temu możesz szybko wykryć nieautoryzowane modyfikacje, infekcje malware czy podmienione skrypty.

W tym artykule dowiesz się, jak w prosty sposób monitorować pliki WordPressa bez dodatkowych wtyczek, a także poznasz kilka narzędzi, które automatyzują proces wykrywania zmian.


Dlaczego warto monitorować zmiany w plikach WordPress?

Nieautoryzowane zmiany w plikach mogą wskazywać na:

  • infekcję złośliwym oprogramowaniem,
  • włamanie lub modyfikację plików przez hakera,
  • błędną aktualizację wtyczki lub motywu,
  • niezamierzoną zmianę podczas edycji przez użytkownika.

Szybkie wykrycie takich zmian pozwala:

  • zatrzymać infekcję zanim się rozprzestrzeni,
  • przywrócić oryginalne pliki z kopii zapasowej,
  • zidentyfikować źródło problemu (np. zainfekowaną wtyczkę).

Jak działa monitorowanie plików?

Monitorowanie polega na porównaniu sum kontrolnych (hashów) plików z wartościami zapisanymi wcześniej.
Jeśli plik został zmodyfikowany, jego hash się zmienia – to sygnał ostrzegawczy.

Najczęściej stosuje się funkcję md5_file() lub sha1_file() w PHP, które tworzą unikalny skrót na podstawie zawartości pliku.


Przykładowy skrypt PHP do monitorowania zmian

Poniżej prosty przykład, jak możesz samodzielnie zbudować skrypt do wykrywania modyfikacji w katalogu WordPressa:

<?php
$directory = ABSPATH; // główny katalog WordPress
$hash_file = WP_CONTENT_DIR . '/file_hashes.json'; // plik z zapisanymi hashami

function get_all_files($dir) {
    $files = [];
    foreach (scandir($dir) as $file) {
        if ($file === '.' || $file === '..') continue;
        $path = $dir . '/' . $file;
        if (is_dir($path)) {
            $files = array_merge($files, get_all_files($path));
        } else {
            if (preg_match('/\.(php|js|css|html)$/', $file)) {
                $files[] = $path;
            }
        }
    }
    return $files;
}

// Tryb: generowanie hashy lub sprawdzanie zmian
$mode = isset($_GET['mode']) && $_GET['mode'] === 'check' ? 'check' : 'generate';
$all_files = get_all_files($directory);

if ($mode === 'generate') {
    $hashes = [];
    foreach ($all_files as $file) {
        $hashes[$file] = md5_file($file);
    }
    file_put_contents($hash_file, json_encode($hashes, JSON_PRETTY_PRINT));
    echo "Utworzono bazę hashów plików.";
} else {
    if (!file_exists($hash_file)) {
        exit('Brak pliku hashów. Uruchom skrypt w trybie generowania.');
    }
    $stored_hashes = json_decode(file_get_contents($hash_file), true);
    $modified = [];

    foreach ($all_files as $file) {
        $current = md5_file($file);
        if (!isset($stored_hashes[$file])) {
            $modified[] = "Nowy plik: $file";
        } elseif ($stored_hashes[$file] !== $current) {
            $modified[] = "Zmodyfikowano: $file";
        }
    }

    foreach (array_diff_key($stored_hashes, array_flip($all_files)) as $file => $hash) {
        $modified[] = "Usunięto: $file";
    }

    if (empty($modified)) {
        echo "Brak zmian w plikach.";
    } else {
        echo "<pre>" . implode("\n", $modified) . "</pre>";
    }
}

Jak działa skrypt:

  1. W trybie generate tworzy plik z hashami wszystkich plików .php, .js, .css, .html.
  2. W trybie check porównuje obecne hashe z wcześniejszymi i wyświetla listę różnic.

✅ Można go uruchamiać automatycznie raz dziennie przez WP-Cron.
✅ Nadaje się do prostych instalacji i serwerów bez dostępu do zewnętrznych narzędzi.


Automatyczne sprawdzanie zmian w WP-Cron

Aby sprawdzanie działało automatycznie, możesz dodać zadanie do harmonogramu WordPressa:

if ( ! wp_next_scheduled( 'check_file_changes' ) ) {
    wp_schedule_event( time(), 'daily', 'check_file_changes' );
}

add_action( 'check_file_changes', function() {
    file_get_contents( site_url( '?mode=check' ) );
});

Dzięki temu WordPress raz dziennie wykona skrypt i – jeśli wykryje zmiany – możesz np. wysłać powiadomienie e-mail.


Zewnętrzne narzędzia i wtyczki

Jeśli wolisz gotowe rozwiązania, możesz skorzystać z narzędzi takich jak:

  • Wordfence Security – wykrywa zmodyfikowane pliki i porównuje je z oryginałem z repozytorium.
  • Sucuri Security – monitoruje zmiany w plikach i powiadamia mailowo.
  • WP Activity Log – śledzi aktywność użytkowników i zmiany plików.

Dla administratorów serwerów polecane są też:

  • Tripwire, AIDE, RKHunter – monitorują zmiany na poziomie systemu plików Linuxa.

Dobre praktyki bezpieczeństwa

  • Regularnie twórz kopie zapasowe (plików i bazy danych).
  • Aktualizuj WordPress, motywy i wtyczki.
  • Nie edytuj plików motywu bez motywu potomnego.
  • Używaj SFTP zamiast FTP.
  • Ogranicz prawa zapisu tylko do katalogów, które tego wymagają.

Podsumowanie

Monitorowanie zmian w plikach WordPress to skuteczny sposób na wczesne wykrycie włamania lub błędnej modyfikacji.
Można to zrobić zarówno prostym skryptem opartym na hashach, jak i za pomocą specjalistycznych wtyczek bezpieczeństwa.
Najważniejsze jest, by proces ten był automatyczny i regularny – tylko wtedy skutecznie ochronisz stronę przed infekcjami.


KROK 1 Z 4

Z CZYM POTRZEBUJESZ POMOCY?