Session-Login mit genau einem Admin-Konto, Passwort als bcrypt-Hash.
Sessions mit HttpOnly, SameSite=Lax, strict mode, ID-Wechsel beim Login,
Inaktivitaets- und absoluter Zeitgrenze; ueber HTTPS wird das Cookie
automatisch auf secure gesetzt. Ein Passwortwechsel entwertet
bestehende Sitzungen.
Das Rate-Limiting zaehlt Fehlversuche pro IP-Hash - die IP selbst wird
nie gespeichert.
SetupToken schliesst das Zeitfenster zwischen Upload und erstem Aufruf:
ohne das Einmal-Token aus dem Datenverzeichnis laesst sich kein Konto
anlegen.
Der Router kennt Platzhalter fuer ein Pfadsegment und liefert 405, wenn
nur die Methode nicht passt. Response kann Arbeit fuer die Zeit NACH dem
Ausliefern vormerken (afterSend) - so verzoegert das Protokollieren
eines Klicks die Weiterleitung nicht.
BasePath deckt drei Installationsarten ab: Webroot auf public/,
Unterverzeichnis und Shared Hosting ohne eigenen Webroot.
SQLite als Standard (keine Einrichtung noetig, WAL aktiviert), optional
MySQL/MariaDB. Beide Treiber nutzen dieselben vorbereiteten Statements.
Die Migrationen laufen automatisch beim ersten Request; jede Migration
liefert das SQL je Treiber. Damit entfaellt ein manueller Schritt beim
Deployment ueber FTP.
data/ enthaelt eine eigene .htaccess als zweite Absicherung, falls das
Verzeichnis beim Hoster doch einmal im Webroot landet.
Plain PHP 8.2+ ohne Framework. Einzige Laufzeit-Abhaengigkeit ist
endroid/qr-code; intl und imagick sind optional (es gibt jeweils einen
Rueckfallweg). Konfiguration ueber .env oder Umgebungsvariablen, damit
dieselbe Anwendung per FTP und per Docker deploybar ist.