geraetesicherheit


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.

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.

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.

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.

Für Entwickler

Datenbank


SpalteTypBedeutung
idbigint,Auto-IncrementPrimärschlüssel
user_idbigintZugehöriger Nutzer
token_hashvarchar(64),uniqueSHA-256-Hash des Geräte-Tokens
labelvarchar(255)Kurzbeschreibung, meist der User-Agent
ipvarchar(45)IP-Adresse bei der Verifizierung
created_atdatetimeErstellt (UTC)
last_useddatetimeZuletzt 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)


HookPrioritätZweck
authenticate35weinhold_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_failed5weinhold_device_handle_login_failed() – fängt den Error-Code weinhold_device_challenge ab und leitet zur Challenge-Seite um
wp_login10weinhold_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


FunktionBeschreibung
weinhold_device_is_trusted($user_id,$raw_token):boolPrü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):boolOb der Nutzer Sicherheitsfragen eingerichtet hat
weinhold_device_verify_answer($user_id,$question_index,$raw_answer):boolPrü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).

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.

Besonderheiten

Netzwerkweit statt pro Site – es gibt bewusst keine Site-Einstellungen; ein Site-Admin, der die Modulseite aufruft, wird automatisch zum Netzwerk-Admin weitergeleitet.

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.

Versionshistorie

VersionDatumÄnderung
1.0.022.09.2026Einführung der Versionierung.