it-swarm.com.de

Was ist der beste Weg, um "Remember Me" für eine Website zu implementieren?

Ich möchte, dass meine Website über ein Kontrollkästchen verfügt, auf das Benutzer klicken können, damit sie sich nicht jedes Mal anmelden müssen, wenn sie meine Website besuchen. Ich weiß, dass ich ein Cookie auf ihrem Computer speichern muss, um dies zu implementieren, aber was sollte in diesem Cookie enthalten sein?

Gibt es außerdem häufige Fehler, auf die Sie achten müssen, um zu verhindern, dass dieses Cookie eine Sicherheitslücke darstellt, die vermieden werden kann, während die Funktion "Erinnere dich an mich" beibehalten wird?

492
Eddie Deyo

Verbesserte Best Practice für dauerhafte Anmelde-Cookies

Sie können diese beschriebene Strategie verwenden hier als Best Practice (2006) oder eine aktualisierte Strategie, die hier beschrieben wird (2015):

  1. Wenn sich der Benutzer erfolgreich mit aktiviertem Remember Me anmeldet, wird zusätzlich zum Standard-Sitzungsverwaltungs-Cookie ein Anmelde-Cookie ausgegeben.
  2. Das Login-Cookie enthält eine Serienkennung und ein Token. Die Serie und der Token sind nicht ermittelbare Zufallszahlen aus einem ausreichend großen Raum. Beide werden zusammen in einer Datenbanktabelle gespeichert, das Token ist gehasht ​​(sha256 ist in Ordnung).
  3. Wenn ein nicht angemeldeter Benutzer die Site besucht und ein Login-Cookie anzeigt, lautet die Serien-ID in der Datenbank nachgeschlagen.
    1. Wenn Serienkennung vorhanden ist und der Hash des Tokens mit dem Hash für diese Serienkennung übereinstimmt, wird der Benutzer als authentifiziert ​​betrachtet. Ein neues Token wird generiert, ein neuer Hash für das Token wird über dem alten Datensatz gespeichert und ein neues Anmelde-Cookie wird an den Benutzer ausgegeben (es ist in Ordnung, die Serien-ID erneut zu verwenden).
    2. Wenn die Serie vorhanden ist, der Token jedoch nicht übereinstimmt, wird ein Diebstahl angenommen. Der Benutzer erhält eine stark formulierte Warnung und alle gespeicherten Sitzungen des Benutzers werden gelöscht.
    3. Wenn der Benutzername und die Serie nicht vorhanden sind, lautet das Anmelde-Cookie ignoriert.

Dieser Ansatz bietet eine gründliche Verteidigung. Wenn es jemandem gelingt, die Datenbanktabelle zu löschen, hat ein Angreifer keine Möglichkeit, sich als Benutzer auszugeben.

519
splattne

Ich würde eine Benutzer-ID und ein Token speichern. Wenn der Benutzer zur Site zurückkehrt, vergleichen Sie diese beiden Informationen mit einem dauerhaften Wert wie einem Datenbankeintrag.

Geben Sie aus Sicherheitsgründen nichts ein, das es jemandem ermöglicht, das Cookie zu ändern, um zusätzliche Vorteile zu erzielen. Speichern Sie beispielsweise nicht ihre Benutzergruppen oder ihr Kennwort. Alles, was geändert werden kann, um Ihre Sicherheit zu umgehen, sollte nicht im Cookie gespeichert werden.

9
dragonmantank

Speichern Sie ihre Benutzer-ID und ein RememberMeToken. Wenn sie sich mit Remember Me Checked anmelden, generieren sie ein neues RememberMeToken (das alle anderen Maschinen ungültig macht, die als Remember Me gekennzeichnet sind).

Wenn sie zurückkehren, suchen Sie sie mit dem Anmeldetoken und stellen Sie sicher, dass die Benutzer-ID übereinstimmt.

8
jonnii

Ich habe selbst hartnäckige Sitzungen untersucht und festgestellt, dass es das Sicherheitsrisiko einfach nicht wert ist. Verwenden Sie es, wenn Sie es unbedingt müssen, aber Sie sollten eine solche Sitzung als nur schwach authentifiziert betrachten und eine neue Anmeldung für alles erzwingen, was für einen Angreifer von Wert sein könnte.

Der Grund dafür ist natürlich, dass Ihre Cookies, die Ihre permanente Sitzung enthalten, so leicht gestohlen werden.

4 Möglichkeiten, um Ihre Cookies zu stehlen (von ein Kommentar von Jens Roland auf der Seite @splattne basierte seine Antwort auf):

  1. Durch Abfangen über eine unsichere Leitung (Packet Sniffing/Session Hijacking)
  2. Durch direkten Zugriff auf den Browser des Benutzers (entweder über Malware oder physischen Zugriff auf die Box)
  3. Durch das Lesen aus der Server-Datenbank (wahrscheinlich SQL Injection, könnte aber alles sein)
  4. Durch einen XSS-Hack (oder einen ähnlichen clientseitigen Exploit)
3
Jarl