Gerätesicherheit
Die Gerätesicherheit ist ein Core-Modul des Weinhold Frameworks – es ist immer geladen (lässt sich aber über eine eigene Einstellung ein-/ausschalten) und wirkt netzwerkweit auf allen Sites. Es erkennt unbekannte Geräte beim Login und verlangt eine Sicherheitsfrage, bevor der Zugang gewährt wird – eine zusätzliche Schutzschicht, die auch bei einem kompromittierten Passwort greift.
Hat ein Nutzer noch keine Sicherheitsfragen hinterlegt, wird der Login trotzdem erlaubt – im Profil erscheint dann ein Hinweis, sie einzurichten. So wird niemand ausgesperrt, der die Funktion noch nicht konfiguriert hat.Allgemein
Wie es funktioniert
Beim Login prüft das Modul per Cookie, ob das aktuelle Gerät bereits als vertrauenswürdig hinterlegt ist. Ist das Gerät unbekannt und hat der Nutzer Sicherheitsfragen eingerichtet, wird der Login abgefangen und eine zufällig ausgewählte Frage gestellt. Erst nach korrekter Antwort wird der Nutzer eingeloggt; auf Wunsch merkt sich das Modul das Gerät danach für eine konfigurierbare Anzahl Tage.
Sicherheitsfragen (Profil)
Jeder Nutzer richtet im eigenen Profil bis zu drei Sicherheitsfragen ein (die erste ist Pflicht, sobald mindestens eine gespeichert werden soll). Zur Auswahl stehen sechs vorgeschlagene Fragen oder ein freier Text. Die Antworten werden nie im Klartext gespeichert, sondern nur als Hash – beim Bearbeiten muss deshalb jedes Feld neu ausgefüllt werden; ein leer gelassenes Antwortfeld behält die bestehende gespeicherte Antwort.
Vertrauenswürdige Geräte
Im Profil sieht jeder Nutzer eine Liste seiner vertrauenswürdigen Geräte (Browser-/Geräte-Kennung, IP, zuletzt genutzt) und kann einzelne Geräte entfernen. Der Button „Auf allen Geräten ausloggen“ beendet zusätzlich alle aktiven Sitzungen und löscht alle gespeicherten Geräte auf einen Schlag.
Admin-Einstellungen
Unter Weinhold Netzwerk → Gerätesicherheit lässt sich das Modul aktivieren/deaktivieren, die Benachrichtigungs-Mail bei neuem Gerät ein-/ausschalten und die Gültigkeitsdauer eines vertrauenswürdigen Geräts festlegen (1–3650 Tage). Da das Modul netzwerkweit wirkt, gibt es keine Einstellungen pro Site – ein Site-Admin wird beim Aufruf automatisch zum Netzwerk-Admin weitergeleitet.
Dateien
modules/device_security_core.php – einzige Datei des Moduls (Core-Modul, das _core.php-Suffix lädt es immer): Datenbank, Einstellungen, Cookie- und Token-Verwaltung, Sicherheitsfragen, Login-Hooks, Profil- und Admin-Oberfläche.
Filter weinhold_auth_profile_extra – hängt die Profil-Sektion (Sicherheitsfragen, Geräteliste) an die Profilseite an. Filter weinhold_email_templates – registriert die zwei modul-eigenen Vorlagen device_new und device_challenge_failed beim E-Mail-Versand-Modul. Filter weinhold_audit_modules – meldet sich beim Audit-Log mit den Aktionen device_verified, device_revoked, challenge_failed, logout_everywhere an.Für Entwickler
Datenbank
Spalte Typ Bedeutung id bigint,Auto-Increment Primärschlüssel user_id bigint Zugehöriger Nutzer token_hash varchar(64),unique SHA-256-Hash des Geräte-Tokens label varchar(255) Kurzbeschreibung, meist der User-Agent ip varchar(45) IP-Adresse bei der Verifizierung created_at datetime Erstellt (UTC) last_used datetime Zuletzt genutzt (UTC)
Tabellenname über weinhold_device_table(), Installation via weinhold_device_maybe_install() (versioniert über die Option weinhold_device_security_db_version auf der Hauptseite).
Login-Flow (Hooks)
Hook Priorität Zweck authenticate 35 weinhold_device_authenticate() – nach erfolgreicher WP-Authentifizierung: bekanntes Gerät durchlassen, unbekanntes Gerät mit vorhandenen Fragen liefert WP_Error(‚weinhold_device_challenge‘, …, $chal_token) statt des Logins wp_login_failed 5 weinhold_device_handle_login_failed() – fängt den Error-Code weinhold_device_challenge ab und leitet zur Challenge-Seite um wp_login 10 weinhold_device_on_login_success() – aktualisiert last_used bei bekanntem Gerät
Die Challenge selbst liegt 5 Minuten als Transient (weinhold_dev_chal_{32-Zeichen-Hex-Token}) und enthält Nutzer-ID, „Angemeldet bleiben“-Flag, Redirect-Ziel und den Index der gestellten Frage.
Wichtige Funktionen
Funktion Beschreibung weinhold_device_is_trusted($user_id,$raw_token):bool Prüft ob ein Geräte-Token zu diesem Nutzer gehört weinhold_device_save_token($user_id,$raw_token,$label,$ip) Speichert ein neues vertrauenswürdiges Gerät weinhold_device_revoke_token($device_id,$user_id) Entfernt ein einzelnes Gerät weinhold_device_revoke_all($user_id) Entfernt alle Geräte eines Nutzers weinhold_device_logout_everywhere($user_id) Zerstört alle Sessions (WP_Session_Tokens) und alle Geräte-Tokens weinhold_device_has_questions($user_id):bool Ob der Nutzer Sicherheitsfragen eingerichtet hat weinhold_device_verify_answer($user_id,$question_index,$raw_answer):bool Prüft eine Antwort per hash_equals() gegen den gespeicherten SHA-256-Hash Integrationspunkte
Filter weinhold_auth_login_override – rendert das Challenge-Formular anstelle des normalen Login-Formulars, wenn der GET-Parameter device_challenge gesetzt ist (genutzt vom user_management-Modul).
Sicherheitsfragen werden nur als hash(’sha256′, …) der kleingeschriebenen, getrimmten Antwort gespeichert, nie im Klartext – der Abgleich läuft über hash_equals(), um Timing-Angriffe zu vermeiden. Kein Zwang zur Einrichtung: Ohne gespeicherte Sicherheitsfragen wird der Login trotzdem erlaubt, nur ein Hinweis-Transient (10 Minuten) sorgt für einen Einrichtungs-Hinweis im Profil. Geräte-Cookie weinhold_device_trust_{COOKIEHASH} ist HttpOnly und SameSite=Strict, bei SSL zusätzlich Secure – auf PHP-Versionen unterhalb von 7.3 übernimmt ein Fallback mit manuell zusammengesetztem Pfad-String dieselbe SameSite-Einstellung. Eine fehlgeschlagene Sicherheitsfrage löst eine separate Warn-Mail aus (device_challenge_failed) – anders als eine neue erfolgreiche Verifizierung, die nur informiert.Besonderheiten
Netzwerkweit statt pro Site – es gibt bewusst keine Site-Einstellungen; ein Site-Admin, der die Modulseite aufruft, wird automatisch zum Netzwerk-Admin weitergeleitet.
Versionshistorie
Version Datum Änderung 1.0.0 22.09.2026 Einführung der Versionierung.