Troy Hunt macht in seinem Artikel " Alles , was Sie schon immer über das Erstellen einer sicheren Funktion zum Zurücksetzen von Passwörtern wissen wollten" einige hervorragende Punkte . Die wichtigsten Auszüge sind:
[T] hier sind zwei gängige Ansätze:
- Generieren Sie ein neues Passwort auf dem Server und senden Sie es per E-Mail
- Senden Sie eine eindeutige URL per E-Mail, um das Zurücksetzen zu erleichtern
Trotz zahlreicher gegenteiliger Anleitungen ist der erste Punkt wirklich nicht der Ort, an dem wir sein wollen. Das Problem dabei ist, dass ein dauerhaftes Kennwort, mit dem Sie jederzeit zurückkehren und es verwenden können, jetzt über einen unsicheren Kanal gesendet wurde und sich in Ihrem Posteingang befindet.
...
Aber es gibt noch ein großes Problem mit dem ersten Ansatz, der die böswillige Sperrung eines Kontos ganz einfach macht. Wenn ich die E-Mail-Adresse von jemandem kenne, der ein Konto auf einer Website besitzt, kann ich ihn jederzeit sperren, indem ich einfach sein Passwort zurücksetze. Es ist ein Denial-of-Service-Angriff, der auf einem Silbertablett serviert wird! Aus diesem Grund sollte ein Reset erst erfolgen, nachdem das Recht des Anforderers erfolgreich überprüft wurde.
Wenn es sich um eine Rücksetz-URL handelt, handelt es sich um eine Website-Adresse, die für diese bestimmte Instanz des Rücksetzvorgangs eindeutig ist.
...
Wir möchten ein eindeutiges Token erstellen, das in einer E-Mail als Teil der Rücksetz-URL gesendet und dann mit einem Datensatz auf dem Server neben dem Benutzerkonto abgeglichen werden kann, um zu bestätigen, dass der E-Mail-Kontoinhaber tatsächlich versucht, das zurückzusetzen Passwort. Das Token kann beispielsweise "3ce7854015cd38c862cb9e14a1ae552b" sein und wird in einer Tabelle neben der ID des Benutzers, der den Reset durchführt, und dem Zeitpunkt, zu dem das Token generiert wurde, gespeichert (mehr dazu gleich). Wenn die E-Mail gesendet wird, enthält sie eine URL wie "Zurücksetzen /? Id = 3ce7854015cd38c862cb9e14a1ae552b". Wenn der Benutzer diese lädt, überprüft die Seite das Vorhandensein des Tokens und bestätigt folglich die Identität des Benutzers und lässt das Kennwort zu verändert sein.
...
Das andere, was wir mit einer Rücksetz-URL tun möchten, ist, das Token zeitlich zu begrenzen, so dass der Rücksetzvorgang innerhalb einer bestimmten Dauer, beispielsweise innerhalb einer Stunde, abgeschlossen sein muss.
...
Schließlich möchten wir sicherstellen, dass dies ein einmaliger Prozess ist. Sobald der Rücksetzvorgang abgeschlossen ist, sollte das Token gelöscht werden, damit die Rücksetz-URL nicht mehr funktioniert. Wie beim vorherigen Punkt soll damit sichergestellt werden, dass ein Angreifer ein sehr begrenztes Fenster hat, in dem er die zurückgesetzte URL missbrauchen kann. Außerdem wird das Token natürlich nicht mehr benötigt, wenn der Rücksetzvorgang erfolgreich abgeschlossen wurde.
Er macht noch viele weitere gute Punkte zur Vermeidung von Informationslecks, CAPTCHAs, Zwei-Faktor-Authentifizierung und natürlich den grundlegenden Best Practices wie Passwort-Hashing. Ich denke, es ist wichtig anzumerken, dass ich Troy in Bezug auf die Nützlichkeit von Sicherheitsfragen nicht zustimme und Bruce Schneiers Skepsis gegenüber der Praxis bevorzuge :
Der Sinn all dieser Fragen ist der gleiche: ein Sicherungskennwort. Wenn Sie Ihr Passwort vergessen haben, kann die geheime Frage Ihre Identität überprüfen, sodass Sie ein anderes Passwort auswählen oder die Site Ihr aktuelles Passwort per E-Mail an Sie senden können. Aus Sicht des Kundendienstes ist dies eine großartige Idee - ein Benutzer vergisst weniger wahrscheinlich den Namen seines ersten Haustieres als ein zufälliges Passwort -, aber aus Sicherheitsgründen schrecklich. Die Antwort auf die geheime Frage ist viel einfacher zu erraten als ein gutes Passwort, und die Informationen sind viel öffentlicher.