Záloha wp-config.php je veřejně dostupná

Co to je

Ve webroot vašeho WordPressu je veřejně dostupný soubor jako wp-config.php.bak, wp-config.php.old, wp-config.txt nebo wp-config.php~. Vznikne to nejčastěji takhle:

Proč je to problém

Klíčový rozdíl od běžného wp-config.php: PHP soubory Apache/nginx vykonává — vrátí HTML output, ne kód. Ale soubor s příponou .bak nebo .txt server pošle jako čistý text. Útočník otevře https://example.cz/wp-config.php.bak a dostane:

S klíči si útočník podepíše cookies admina. S databází vyplení obsah a nastaví heslo. Zpravidla je hotovo.

Jak to opravit

Krok 1 — smazat všechny .bak / .old / .txt zálohy

cd /var/www/example.cz
ls -la wp-config*
# najít a smazat
rm wp-config.php.bak wp-config.php.old wp-config.php~ wp-config.txt

Projděte i celý webroot:

find . -type f \( -name "*.bak" -o -name "*.old" -o -name "*~" \) -ls

Krok 2 — rotovat to, co bylo v .bak souboru

Předpokládejte, že někdo soubor stáhl. Vyměňte:

  1. Heslo k databázi. Po změně updateujte i wp-config.php: define('DB_PASSWORD', 'noveheslo');.
  2. WordPress security keys (AUTH_KEY atd.). Nové vygenerujte na api.wordpress.org/secret-key/1.1/salt/ a nahraďte. Tahle změna odhlásí všechny aktivní uživatele — je to v pořádku.

Krok 3 — zablokovat .bak / .old patterns na webserveru

Aby se další omylem vytvořená záloha nedostala ven:

nginx:

location ~* \.(bak|old|backup|orig|swp|save|~)$ {
    deny all;
    return 404;
}

Apache (.htaccess):

<FilesMatch "\.(bak|old|backup|orig|swp|save|~)$">
    Require all denied
</FilesMatch>

Krok 4 — zálohovat správně

Záloha wp-config.php patří mimo webroot, na verzování (privátní git, S3 bucket se SSE, dedikovaný backup hosting). Nikdy ne vedle aktivní verze.

Reference