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

510

Ich möchte, dass meine Website über ein Kontrollkästchen verfügt, auf das Benutzer klicken können, damit sie sich nicht bei jedem Besuch meiner Website anmelden müssen. 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 auch 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 "An mich erinnern" beibehalten wird?

Vort3x
quelle
5
Überprüfen Sie stackoverflow.com/questions/549/… (Teil II der Top-Antwort)
Frosty Z
Wenn Sie ASP.NET verwenden, überprüfen Sie codeproject.com/Articles/779844/Remember-Me
Believe2014
1
Es gibt einige sehr nützliche Informationen in Security SE ~ security.stackexchange.com/questions/19676/…
b1nary.atr0phy
Die derzeit von splattne akzeptierte Antwort ist zu komplex. Erstellen Sie ein +16-Byte-Token aus einer zufälligen Quelle, hashen Sie es und speichern Sie die Hash-Konto-ID in der Datenbank. Senden Sie dann das Token in einem HTTPS + httpOnly-Cookie an den Benutzer (base64-codiert) (damit Javascript nicht darauf zugreifen / es stehlen kann). Auf diese Weise kann niemand das Token erraten oder Personen mit ungültigen Vermutungen abmelden. Selbst wenn Ihre Datenbank gehackt wird, kann niemand die Token in der Datenbank verwenden (sie sind gehasht). Nur der ursprüngliche Client (oder jemand, der das Token irgendwie aus dem Browserspeicher stiehlt) kann es verwenden.
Xeoncross

Antworten:

536

Verbesserte Best Practice für dauerhafte Anmelde-Cookies

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

  1. Wenn sich der Benutzer erfolgreich mit aktiviertem Remember Me anmeldet, wird zusätzlich zum Standard-Sitzungsverwaltungs-Cookie ein Anmelde-Cookie ausgegeben .
  2. Das Anmeldecookie enthält eine Serienkennung und ein Token . Die Reihe und das Token sind nicht erratbare Zufallszahlen aus einem angemessen großen Raum. Beide werden zusammen in einer Datenbanktabelle gespeichert, das Token wird gehasht (sha256 ist in Ordnung).
  3. Wenn ein nicht angemeldeter Benutzer die Site besucht und ein Anmeldecookie anzeigt, wird die Serienkennung in der Datenbank nachgeschlagen .
    1. Wenn die 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 erzeugt wird , ein neuer Hash für das Token über den alten Datensatz gespeichert ist, und ein neuer Login - Cookie wird an den Benutzer ausgegeben (es ist in Ordnung , die wiederverwenden Serie Kennung ).
    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 vom Benutzer gespeicherten Sitzungen werden gelöscht.
    3. Wenn der Benutzername und die Serie nicht vorhanden sind, wird das Anmeldecookie ignoriert .

Dieser Ansatz bietet eine gründliche Verteidigung. Wenn es jemandem gelingt, die Datenbanktabelle zu verlieren, gibt dies einem Angreifer keine offene Tür, um sich als Benutzer auszugeben.

splattne
quelle
20
Siehe auch: stackoverflow.com/questions/549/… Sie sollten NICHT die 'verbesserte' Version lesen
Jacco
8
Das Problem dabei ist, dass Sie den Benutzernamen im Cookie verfügbar machen, obwohl dies bei Google Mail der Fall ist. Warum benötigen Sie sowohl eine Serien-ID als auch einen Token? Wäre ein größeres Zeichen nicht in Ordnung?
Dan Rosenstark
10
Auch in Bezug auf dieses Modell, was es ist, um einen Angreifer daran zu hindern, zu stehlen und dann das Cookie auf seinem Computer zu platzieren und das Cookie vom gehackten Computer zu löschen. Sein Computer würde dann nach Bedarf authentifiziert und aktualisiert, ohne dass der gehackte Computer es jemals weiß? Die einzige Änderung wäre, dass sich der Benutzer des gehackten Computers erneut anmelden und sich an mich erinnern müsste. Ob der gehackte Benutzer dies erkennt oder nicht, ist ungewiss.
24
@HiroProtagonist Die Serienkennung soll einen DoS-Angriff verhindern. Ohne sie könnte ich schnell ein Skript schreiben, das mit jedem Benutzernamen und einem ungültigen Token auf Ihre Site trifft und alle auf Ihrer Site abmeldet.
Chris Moschini
6
Diese Lösung ist FALSCH und verarbeitet keine Cuncurrency: Wenn zwei Remember-Me-Authentifizierungsanforderungen gleichzeitig mit demselben Remember-Me-Cookie eingehen, ist das erste erfolgreich und ändert das Token, das zweite führt zu einer nicht erfolgreichen Authentifizierung ein Fehlalarm (da das Token bereits durch die erste Anforderung geändert wurde). (Diese Situation kann auftreten, wenn der Browser
gestartet
9

Ich würde eine Benutzer-ID und ein Token speichern. Wenn der Benutzer zur Site zurückkehrt, vergleichen Sie diese beiden Informationen mit etwas Beständigem 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.

Drachenmantel
quelle
8

Speichern Sie ihre UserId und ein RememberMeToken. Wenn sie sich mit der Option "Angemeldet bleiben" anmelden, wird ein neues RememberMeToken generiert (das alle anderen markierten Computer ungültig macht, die an mich erinnern).

Wenn sie zurückkehren, suchen Sie sie nach dem Remember Me-Token und stellen Sie sicher, dass die UserId übereinstimmt.

jonnii
quelle
Dies kann in Sekundenschnelle erzwungen werden. Ich werde einfach meine user_id auf 1 setzen und alle Token brutal erzwingen. Es wird mir Zugang in Sekunden geben
Ein Freund
4

Ich habe festgestellt, dass es das Sicherheitsrisiko einfach nicht wert ist. Verwenden Sie es, wenn Sie es unbedingt müssen, aber Sie sollten eine solche Sitzung nur als 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 dauerhafte Sitzung enthalten, so leicht gestohlen werden können.

4 Möglichkeiten, Ihre Cookies zu stehlen (aus einem Kommentar von Jens Roland auf der Seite, @splattneauf der seine Antwort basiert):

  1. Durch Abfangen über eine unsichere Leitung (Paket-Sniffing / Session-Hijacking)
  2. Durch direkten Zugriff auf den Browser des Benutzers (entweder über Malware oder physischen Zugriff auf die Box)
  3. Durch Lesen aus der Serverdatenbank (wahrscheinlich SQL Injection, könnte aber alles sein)
  4. Durch einen XSS-Hack (oder einen ähnlichen clientseitigen Exploit)
Jarl
quelle
104
1. HTTPS soll dies verhindern. 2. Angemeldet bleiben ist hier nicht das Sicherheitsproblem, Sie haben größere Probleme. 3. Wie 2. 4. Dies kann durch Zugangskontrollrichtlinien und gute Hygiene bei der Eingabe verhindert werden. Wenn Sie diese Schritte nicht ausführen, haben Sie erneut größere Probleme als "Angemeldet bleiben".
Chris Moschini