PHP Login Scripte
PHP Login-Skripte: hardcodiert vs. sicher (Hash, Sessions, Redirects)
In diesem Artikel schauen wir uns typische PHP-Login-Ansätze an: von „schnell mal hardcodiert“ bis zu sauberem Passwort-Hashing, Sessions, Redirects und den häufigsten Stolperfallen.
1) Warum „hardcodierte“ Logins zwar funktionieren, aber gefährlich sind
Ein hardcodierter Login bedeutet meistens: Benutzername und Passwort stehen direkt im Code, z. B.: „wenn $_POST['user'] = admin und $_POST['pass'] = geheim, dann login ok“. Das ist für schnelle Tests praktisch – für echte Projekte aber problematisch.
- Keine Skalierung: Du kannst nicht sinnvoll mehrere Benutzer verwalten.
- Änderungen nur per Code-Deploy: Passwort ändern = Code ändern = Risiko.
- Häufig Klartext-Passwörter: Wenn jemand Zugriff auf Dateien/Backup bekommt, ist alles offen.
- Fehleranfällig: Oft fehlen Rate-Limits, Session-Schutz, Redirect-Sicherheit usw.
Hardcoding kann okay sein für lokale Prototypen, interne Tools im eigenen Netz (mit Vorsicht), oder wenn du Zugriff zusätzlich absicherst (z. B. per Basic Auth / IP-Whitelist). Für alles andere: lieber gleich „richtig“ bauen.
2) Passwort-Hashing: der wichtigste Schritt Richtung Sicherheit
In einem sicheren Login speicherst du Passwörter niemals im Klartext, sondern als Hash. In PHP nutzt man dafür password_hash() beim Setzen/Ändern des Passworts und password_verify() beim Login-Vergleich.
Der große Unterschied: Selbst wenn deine Datenbank geleakt wird, stehen dort keine echten Passwörter – nur Hashes, die (je nach Stärke) schwer zurückzurechnen sind. Außerdem enthalten moderne Hashes einen eingebauten Salt und passende Parameter.
// Passwort setzen (z.B. bei Registrierung/Passwort ändern)
$hash = password_hash($plainPassword, PASSWORD_DEFAULT);
// Login prüfen
if (password_verify($inputPassword, $hashFromDatabase)) {
// ok
}
Wichtig: Niemals selbst “eigene Hash-Logik” basteln (z. B. md5 oder sha1). Das ist heute nicht mehr zeitgemäß und in vielen Fällen unsicher.
3) Sessions: Wie PHP „eingeloggt bleiben“ organisiert
Das Login-Formular ist nur der Start. Entscheidend ist, wie du danach den Zustand „User ist eingeloggt“ speicherst. Dafür nutzt man in klassischen PHP-Apps meist Sessions.
Typisch ist: Nach erfolgreichem Login setzt du z. B. $_SESSION['user_id'] oder $_SESSION['is_logged_in']. Auf jeder geschützten Seite prüfst du diese Variable.
// Ganz oben in jeder Datei, die Sessions nutzt:
session_start();
// Beim Login-OK:
$_SESSION['user_id'] = $userId;
$_SESSION['role'] = $role; // optional
Session-Sicherheit (kurz & praxisnah)
- Session-ID regenerieren nach Login (Schutz gegen Session-Fixation).
- Logout sollte Session leeren und idealerweise zerstören.
- Cookies sicher setzen (HttpOnly, Secure bei HTTPS, SameSite).
// Nach erfolgreichem Login:
session_regenerate_id(true);
4) Redirects: „Nach Login weiterleiten“ – richtig gemacht
Redirects sind super praktisch: Nach Login geht’s ins Dashboard, nach Logout zurück zur Login-Seite, und wer nicht eingeloggt ist, wird automatisch umgeleitet.
In PHP ist das meist header('Location: ...'). Wichtig dabei:
- Immer vor Ausgabe: Keine Leerzeichen/HTML vorher, sonst „headers already sent“.
- Immer beenden: Nach dem Redirect
exit;aufrufen. - Open Redirect verhindern: Nicht blind eine URL aus
$_GETübernehmen.
// Beispiel: nicht eingeloggt => Login
if (empty($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
Weiterleitung zur ursprünglich gewünschten Seite
Ein Klassiker: User will /admin.php öffnen, ist aber nicht eingeloggt. Du leitest auf login.php um – und nach Login soll er wieder zurück. Das macht man oft über einen redirect-Parameter. Aber: nur erlaubte Ziele zulassen!
// Beispiel-Idee (Konzept):
// login.php?redirect=admin.php
// Nach Login: nur relative, erlaubte Pfade akzeptieren (Whitelist)
5) Typische Fehler in Login-Skripten (und wie du sie vermeidest)
- Klartext-Passwörter (in DB oder Code) statt
password_hash(). - SQL-Injection, wenn Login-Daten unsicher in SQL gebaut werden – Lösung: Prepared Statements (PDO / MySQLi).
- Keine Brute-Force-Bremse: fehlende Limits, kein Delay, keine Sperre.
- Session nicht regeneriert nach Login.
- Redirect ohne exit – Code läuft weiter und macht ggf. doch noch Ausgabe.
- Zu genaue Fehlermeldungen („Benutzer existiert nicht“ vs. „Passwort falsch“) – besser neutral bleiben.
6) Fazit
Hardcodierte Logins sind schnell, aber für echte Anwendungen fast immer ein Risiko. Ein solides Login in PHP besteht aus: Passwort-Hashing (password_hash/verify), Sessions (inkl. session_regenerate_id), und sauberen Redirects (mit exit und ohne Open-Redirect-Lücken).