Rolf B: Remember-Me-Funktion einrichten (CSRF-Token erstellen)

Beitrag lesen

Hallo borisbaer,

der PHP Sessioncookie sollte immer temporär sein.

Ein RememberMe-Token ist dagegen ein persistenter Cookie, heißt: Unter der "Remember Me" Checkbox muss ein DSGVO-Hinweis stehen („Wenn Sie diesen Schalter aktivieren, gestatten Sie, dass auf Ihrem Computer ein Cookie gespeichert wird“ - oder so). Inhalt des RememberMe-Tokens ist beispielsweise ein langer Zufallswert, den Du auch in der User-DB speicherst. Kommt ein Webrequest herein, für den die Session leer ist, aber für den ein RememberMe Cookie vorliegt, kannst Du den zugehörigen User automatisch anmelden.

Problem 1: Was machst Du, wenn sich ein User auf Gerät 1 mit "Remember Me" anmeldet und dann von Gerät 2 kommt. Er meldet sich dort auch an und aktiviert "Remember Me". Speicherst Du nun auf beiden Geräten das gleiche Token?

Wenn ja, wird sich dieses Token im Lauf der Zeit auf diverse Geräte verbreiten. Ist das sicher? Hm. Weiß nicht. Aber vermutlich unvermeidbar, denn:

Wenn nein, überschreibst Du das Token in der DB durch ein anderes und machst damit den "Remember Me" vom ersten Gerät kaputt.

Problem 2: Wenn es irgendwie gelingt, das Token zu "klauen" (keine Ahnung welche boshaften Leaks es dafür gibt) und auf ein anderes Gerät zu implantieren, ist damit auch der Login geklaut. Eigentlich sollen die Browser ja dafür mittlerweile die nötigen Schutzschirme aufrichten, und bei https-Transport und einer HttpOnly Kennung am Cookie sollte das auch vor JavaScript und Drahthaien versteckt sein, aber HTTPS lässt sich aufbrechen, wenn Du auf einem Fremd-PC unterwegs bist, dem man geeignete Zertifikate untergeschoben hat (wie z.B. der, auf dem ich meine Brötchen verdiene. Mein Arbeitgeber bricht https auf und signiert den Traffic mit dem eigenen Zertifikat neu. Der PC ist in der Firmen-Domäne, bekommt das Zertifikat per Policy aufgezwungen und schon ist https für den Eimer).

Eine Alternative zu einem Remember-Me Zufallstoken, das im Userprofil gespeichert ist, ist ein JWT (JSON Web Token). Das ist ein vorgeschlagener Internetstandard für die Vermittlung einer Authentication durch Identitätsprovider. Ein JWT ist letztlich ein JSON-Objekt mit geeigneten Inhalten, dass Du zum String machst, base64-codierst, mit einem Server-Key signierst und beispielsweise als Cookie übermittelst. Im JWT kannst Du z.B. den Usernamen ablegen. Wenn Du magst, kannst Du den JSON-String auch noch aufwändig verschlüsseln, bevor Du ihn signierst.

Kommt ein Request ohne Login, aber mit korrekt signiertem JWT herein, akzeptierst Du das als gültigen Login. In regelmäßigen Abständen musst Du den Key erneuern, und JWTs, die mit der vorigen Keyversion hereinkommen, signierst Du neu. Wieviele vorherige Keyversionen du akzeptierst, musst Du von der gewünschten Lebensdauer des JWT-Cookie abhängig machen. Aber es gilt das gleiche wie beim Zufallstoken: Wird das JWT geklaut, hast Du ein Security-Loch.

Was für mich bedeutet: RememberMe sollte für Anwendungen, bei denen gebrochene Security ein Problem darstellt, NICHT verwendet werden.

Rolf

--
sumpsi - posui - obstruxi