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:
- Heslo k databázi (
DB_PASSWORD) - API klíče — Stripe, Mailgun, AWS, OpenAI
- JWT secret používaný k podepisování přihlašovacích tokenů
- SMTP přihlašovací údaje pro odesílání e-mailů
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řesgit pullpřímo dopublic_htmla nikdo si neuvědomil, že.envtaky 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é:
- Heslo k databázi.
- Všechny API klíče (Stripe, Mailgun, atd. — v jejich administracích jako „rotate“ / „revoke“).
- 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).
- 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.phpKrok 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é.