Po pierwsze, musimy wiedzieć, co już wiesz o użytkowniku. Oczywiście masz nazwę użytkownika i stare hasło. Co jeszcze wiesz? Masz adres email? Czy masz dane dotyczące ulubionego kwiatu użytkownika?
Zakładając, że masz nazwę użytkownika, hasło i działający adres e-mail, musisz dodać dwa pola do swojej tabeli użytkowników (zakładając, że jest to tabela bazy danych): datę o nazwie new_passwd_expire i ciąg new_passwd_id.
Zakładając, że masz adres e-mail użytkownika, gdy ktoś żąda zresetowania hasła, aktualizujesz tabelę użytkowników w następujący sposób:
new_passwd_expire = now() + some number of days
new_passwd_id = some random string of characters (see below)
Następnie wyślij wiadomość e-mail do użytkownika pod tym adresem:
Drogi taki a taki
Ktoś zażądał nowego hasła do konta użytkownika <nazwa użytkownika> w <nazwa Twojej witryny>. Jeśli poprosiłeś o zresetowanie hasła, kliknij ten link:
http://example.com/yourscript.lang?update= < new_password_id >
Jeśli ten link nie działa, możesz przejść do http://example.com/yourscript.lang i wprowadzić następujące informacje w formularzu: <new_password_id>
Jeśli nie prosiłeś o zresetowanie hasła, możesz zignorować tę wiadomość e-mail.
Dzięki, yada yada
Teraz kodowanie yourscript.lang: Ten skrypt potrzebuje formularza. Jeśli aktualizacja zmiennej przekazała adres URL, formularz po prostu zapyta o nazwę użytkownika i adres e-mail użytkownika. Jeśli aktualizacja nie zostanie pomyślnie zakończona, zostanie wyświetlony monit o podanie nazwy użytkownika, adresu e-mail i kodu identyfikacyjnego przesłanego w wiadomości e-mail. Pytasz również o nowe hasło (oczywiście dwukrotnie).
Aby zweryfikować nowe hasło użytkownika, należy sprawdzić, czy nazwa użytkownika, adres e-mail i kod identyfikacyjny są zgodne, czy żądanie nie wygasło, a dwa nowe hasła są zgodne. Jeśli się powiedzie, zmień hasło użytkownika na nowe hasło i wyczyść pola resetowania hasła z tabeli użytkowników. Pamiętaj również, aby wylogować użytkownika / wyczyścić wszelkie pliki cookie związane z logowaniem i przekierować użytkownika na stronę logowania.
Zasadniczo pole new_passwd_id to hasło, które działa tylko na stronie resetowania hasła.
Jedna potencjalna poprawa: możesz usunąć <nazwa użytkownika> z wiadomości e-mail. „Ktoś zażądał zresetowania hasła dla konta pod tym adresem e-mail…” W ten sposób nazwa użytkownika jest znana tylko użytkownikowi, jeśli wiadomość e-mail zostanie przechwycona. Nie zacząłem w ten sposób, ponieważ jeśli ktoś atakuje konto, to już zna nazwę użytkownika. To dodatkowe niejasności powstrzymują ataki typu man-in-the-middle na wypadek, gdyby ktoś złośliwy przechwycił wiadomość e-mail.
Jeśli chodzi o Twoje pytania:
generowanie losowego ciągu: Nie musi być skrajnie losowy. Dowolny generator GUID lub nawet md5 (concat (salt, current_timestamp ())) jest wystarczający, gdy sól jest czymś w rekordzie użytkownika, takim jak konto znacznika czasu zostało utworzone. To musi być coś, czego użytkownik nie może zobaczyć.
timer: Tak, potrzebujesz tego tylko po to, aby zachować rozsądną bazę danych. Naprawdę potrzebny jest nie więcej niż tydzień, ale co najmniej 2 dni, ponieważ nigdy nie wiadomo, jak długo może potrwać opóźnienie wiadomości e-mail.
Adres IP: ponieważ wiadomość e-mail może być opóźniona o kilka dni, adres IP jest przydatny tylko do logowania, a nie do weryfikacji. Jeśli chcesz to zarejestrować, zrób to, w przeciwnym razie nie będziesz go potrzebować.
Ekran resetowania: patrz wyżej.
Mam nadzieję, że to wszystko. Powodzenia.