Zunächst müssen wir wissen, was Sie bereits über den Benutzer wissen. Offensichtlich haben Sie einen Benutzernamen und ein altes Passwort. Was weißt du noch? Hast du eine Email adresse? Haben Sie Daten zur Lieblingsblume des Benutzers?
Angenommen, Sie haben einen Benutzernamen, ein Kennwort und eine funktionierende E-Mail-Adresse, müssen Sie Ihrer Benutzertabelle zwei Felder hinzufügen (vorausgesetzt, es handelt sich um eine Datenbanktabelle): ein Datum mit dem Namen new_passwd_expire und eine Zeichenfolge new_passwd_id.
Angenommen, Sie haben die E-Mail-Adresse des Benutzers. Wenn jemand ein Zurücksetzen des Kennworts anfordert, aktualisieren Sie die Benutzertabelle wie folgt:
new_passwd_expire = now() + some number of days
new_passwd_id = some random string of characters (see below)
Als Nächstes senden Sie eine E-Mail an den Benutzer unter folgender Adresse:
Lieber so und so
Jemand hat ein neues Passwort für das Benutzerkonto <Benutzername> unter <Name Ihrer Website> angefordert. Wenn Sie dieses Zurücksetzen des Passworts angefordert haben, folgen Sie diesem Link:
http://example.com/yourscript.lang?update= < new_password_id >
Wenn dieser Link nicht funktioniert, können Sie zu http://example.com/yourscript.lang gehen und Folgendes in das Formular eingeben: <new_password_id>
Wenn Sie kein Zurücksetzen des Kennworts angefordert haben, können Sie diese E-Mail ignorieren.
Danke, yada yada
Codieren Sie jetzt Ihrecript.lang: Dieses Skript benötigt ein Formular. Wenn das var-Update die URL weitergegeben hat, werden im Formular nur der Benutzername und die E-Mail-Adresse des Benutzers abgefragt. Wenn das Update nicht bestanden wird, werden Sie nach Benutzername, E-Mail-Adresse und dem in der E-Mail gesendeten ID-Code gefragt. Sie fragen auch nach einem neuen Passwort (natürlich zweimal).
Um das neue Kennwort des Benutzers zu überprüfen, überprüfen Sie, ob Benutzername, E-Mail-Adresse und ID-Code übereinstimmen, ob die Anforderung nicht abgelaufen ist und ob die beiden neuen Kennwörter übereinstimmen. Bei Erfolg ändern Sie das Kennwort des Benutzers in das neue Kennwort und löschen die Felder zum Zurücksetzen des Kennworts aus der Benutzertabelle. Stellen Sie außerdem sicher, dass Sie den Benutzer abmelden / alle anmeldebezogenen Cookies löschen und den Benutzer auf die Anmeldeseite umleiten.
Im Wesentlichen ist das Feld new_passwd_id ein Kennwort, das nur auf der Seite zum Zurücksetzen des Kennworts funktioniert.
Eine mögliche Verbesserung: Sie können <Benutzername> aus der E-Mail entfernen. "Jemand hat ein Zurücksetzen des Passworts für ein Konto unter dieser E-Mail-Adresse angefordert ..." Damit wird der Benutzername nur dem Benutzer bekannt, wenn die E-Mail abgefangen wird. Ich habe nicht so angefangen, denn wenn jemand das Konto angreift, kennt er den Benutzernamen bereits. Diese zusätzliche Dunkelheit verhindert Man-in-the-Middle-Angriffe auf Gelegenheiten, falls jemand Böswilliges die E-Mail abfängt.
Wie für Ihre Fragen:
Generieren der zufälligen Zeichenfolge: Sie muss nicht extrem zufällig sein. Jeder GUID-Generator oder sogar md5 (concat (salt, current_timestamp ())) ist ausreichend, wenn Salt im Benutzerdatensatz etwas ist, wie ein Zeitstempelkonto erstellt wurde. Es muss etwas sein, das der Benutzer nicht sehen kann.
Timer: Ja, Sie benötigen dies nur, um Ihre Datenbank gesund zu halten. Nicht mehr als eine Woche ist wirklich notwendig, aber mindestens 2 Tage, da Sie nie wissen, wie lange eine E-Mail-Verzögerung dauern kann.
IP-Adresse: Da sich die E-Mail um Tage verzögern kann, ist die IP-Adresse nur für die Protokollierung und nicht für die Validierung nützlich. Wenn Sie es protokollieren möchten, tun Sie dies, andernfalls benötigen Sie es nicht.
Bildschirm zurücksetzen: Siehe oben.
Hoffe das deckt es ab. Viel Glück.