Volker´s Blog

Archiv

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).

© 2025 Volker Niederastroth

© Copyright 2025 Volker Niederastroth

Besucherstatistik

Besucher online: 4

Besucher heute: 387

Besucher diese Woche: 1391

Besucher diesen Monat: 11948

Gesamtbesucher: 22512

Sonntag, 28. Dezember 2025 – 13:27:20 Uhr
💬