Soubor .env je veřejně dostupný

Co to je

Soubor .env je v kořeni vašeho webu (https://example.cz/.env) volně přístupný. Když ho někdo stáhne, dostane všechno, co je v něm uložené.

Proč je to problém

.env obvykle obsahuje:

Když útočník získá tyhle hodnoty, je zpravidla game over. Stáhne si databázi, podepíše si JWT s admin právy, pošle phishing přes vaši SMTP. Nepotřebuje exploitovat vůbec nic v aplikaci.

Tohle je nejčastější „hloupý fail“, kterého si všímáme. Většinou se stane, když se aplikace deployuje přes git pull přímo do public_html a nikdo si neuvědomil, že .env taky leze do webroot.

Jak to opravit

Krok 1 — okamžitě zablokovat přístup

nginx:

location ~ /\.env {
    deny all;
    return 404;
}

Apache (.htaccess v root):

<Files ".env">
    Require all denied
</Files>

Po nasazení ověřte: curl -I https://example.cz/.env — má vrátit 403 nebo 404.

Krok 2 — ROTOVAT všechny secrets, které tam byly

Pokud byl .env veřejně dostupný i jen chvíli, předpokládejte, že někdo už ho má. Vygenerujte nové:

  1. Heslo k databázi.
  2. Všechny API klíče (Stripe, Mailgun, atd. — v jejich administracích jako „rotate“ / „revoke“).
  3. JWT secret (po výměně se budou muset všichni přihlášení uživatelé znovu přihlásit — je to v pořádku).
  4. SMTP heslo.

Krok 3 — přesunout .env mimo webroot

Dlouhodobě patří .env nad úroveň public_html. Aplikace ho čte z absolutní cesty, web server se na něj nikdy nedostane.

/var/www/example.cz/
├── app/
│   └── .env          ← tady
└── public_html/      ← document root
    └── index.php

Krok 4 — zkontrolujte git history

Pokud byl .env kdy commitnutý do gitu, je v historii navždy. Použijte BFG Repo-Cleaner nebo git filter-repo a force-push. Otevřené repo bez force-pushe = secrets stále dostupné.

Reference