PHP-Session-Login
Schlanker Auth-Layer für statische PHP-Seiten: in-page Login-Form, bcrypt-Hashes in einer Datei, Session-Cookie. Funktioniert auch da, wo Basic Auth nicht durchkommt.
Schlanker Auth-Layer für statische PHP-Seiten: in-page Login-Form, bcrypt-Hashes in einer Datei, Session-Cookie. Funktioniert auch da, wo Basic Auth nicht durchkommt.
Klassisches HTTP Basic Auth ist der einfachste Schutz für eine private
Webseite – funktioniert aber in manchen Browser-/Proxy-Konstellationen
schlicht nicht: der Anmelde-Dialog kommt nie hoch, der Besucher sieht
nur eine leere Seite oder eine generische Fehlermeldung. Genau das war
bei Voggenreiter mit dem ursprünglichen Apache-Basic-Auth-Setup auf
intern, hinter Login passiert.
Die Antwort: ein eigener Auth-Layer in PHP. Statt sich auf den Browser- Dialog zu verlassen, liefert die Seite eine ganz normale HTML-Login- Karte aus – das funktioniert immer, egal welcher Browser oder welcher Proxy dazwischen sitzt. Gleichzeitig bleibt der Aufwand klein: eine einzelne PHP-Datei, keine Datenbank, keine externen Dienste.
Jede ausgelieferte Seite endet auf .php und beginnt mit
einer einzigen Zeile: require_once $_SERVER['DOCUMENT_ROOT'] .
'/der Zugangsschutz über PHP-Sitzungen';. Diese Datei prüft das Session-Flag
$_SESSION['authed'].
Ist es gesetzt, kehrt sie still zurück und die Seite rendert normal.
Ist es nicht gesetzt, antwortet sie selbst mit HTTP 401 und einer
eingebetteten Login-Karte. Wer Benutzername und Passwort einträgt,
schickt einen POST an dieselbe URL: der Zugangsschutz über PHP-Sitzungen prüft den
Hash mit password_verify, regeneriert die Session-ID,
setzt das Auth-Flag und macht einen 302-Redirect auf die ursprünglich
angefragte Seite. Ab dann liefert der Browser den Cookie
KIR_SESSION bei jedem Request mit – 30 Tage lang.
session_regenerate_id(true) verhindert Session-FixationSecure (nur HTTPS), HttpOnly (kein JS-Zugriff), SameSite=Lax (kein CSRF aus Fremdseiten)usleep bei falschem Passwort macht systematisches Durchprobieren spürbar teurerder Zugangsschutz über PHP-Sitzungen liegt zwar im Web-Root, wird aber von Apache als PHP geparst – der Klartext-Hash wird nie ausgeliefertder Zugangsschutz über PHP-Sitzungen per header() gesetzt – wirkt auch dann, wenn Apache mod_headers mal nicht greiftWer sich auf der Webseite anmeldet, ist kein Nutzer
des darunter liegenden Systems (auf der NAS: kein DSM-User, kein
SFTP-Konto, kein SMB-Zugriff). Die Hash-Liste in der Zugangsschutz über PHP-Sitzungen
ist eine völlig eigene Welt. Selbst wenn das Web-Passwort
kompromittiert würde, käme jemand maximal an die ohnehin private
Webseite – nicht an Dateien, nicht an die DSM-Oberfläche, nicht an
andere Dienste am gleichen Rechner.
Der Aufbau ist absichtlich klein gehalten: eine Datei, eine Liste. Für ein bis fünf Nutzer ist das ideal – kein Overhead, kein Server, keine Datenbank. Wenn mehr Nutzer dazukommen, lässt sich die User-Liste in eine SQLite-Datei auslagern oder gegen einen externen OIDC-Provider tauschen. Die eigentliche Auth-Mechanik (Cookie, Session-Handling, in-page-Form, Security-Header) bleibt dabei identisch.