Die .env-Datei ist öffentlich zugänglich
Worum es geht
Die Datei .env liegt im Wurzelverzeichnis Ihrer Website (https://example.cz/.env) und ist frei zugänglich. Wer sie herunterlädt, erhält alles, was darin gespeichert ist.
Warum das ein Problem ist
.env enthält regelmäßig:
- das Datenbankpasswort (
DB_PASSWORD) - API-Schlüssel — Stripe, Mailgun, AWS, OpenAI
- das JWT-Secret, mit dem Login-Tokens signiert werden
- SMTP-Zugangsdaten zum Versenden von E-Mails
Wenn ein Angreifer an diese Werte gelangt, ist es in der Regel game over. Er lädt sich die Datenbank herunter, signiert sich ein JWT mit Admin-Rechten und verschickt Phishing über Ihren SMTP-Server. Er muss überhaupt nichts in der Anwendung exploiten.
Das ist das häufigste „dumme Versagen“, das uns auffällt. Meist passiert es, wenn eine Anwendung pergit pulldirekt inspublic_htmldeployt wird und niemandem klar war, dass.envebenfalls im Webroot landet.
Wie man es behebt
Schritt 1 — den Zugriff sofort sperren
nginx:
location ~ /\.env {
deny all;
return 404;
}Apache (.htaccess im Root):
<Files ".env">
Require all denied
</Files>Nach dem Deployment prüfen: curl -I https://example.cz/.env — muss 403 oder 404 zurückgeben.
Schritt 2 — ALLE Secrets ROTIEREN, die dort lagen
Falls .env auch nur kurz öffentlich erreichbar war, gehen Sie davon aus, dass es bereits jemand hat. Erzeugen Sie neue:
- das Datenbankpasswort.
- alle API-Schlüssel (Stripe, Mailgun usw. — in deren Verwaltungsoberflächen als „rotate“ / „revoke“).
- das JWT-Secret (nach dem Austausch müssen sich alle angemeldeten Nutzer erneut anmelden — das ist in Ordnung).
- das SMTP-Passwort.
Schritt 3 — .env aus dem Webroot herausverschieben
Langfristig gehört .env oberhalb von public_html. Die Anwendung liest es über einen absoluten Pfad, der Webserver kann nie darauf zugreifen.
/var/www/example.cz/
├── app/
│ └── .env ← hier
└── public_html/ ← document root
└── index.phpSchritt 4 — die Git-History prüfen
Falls .env jemals in Git committet wurde, steckt es für immer in der History. Verwenden Sie BFG Repo-Cleaner oder git filter-repo und einen Force-Push. Ein offenes Repo ohne Force-Push = die Secrets sind weiterhin zugänglich.