Troy Hunt przedstawia kilka doskonałych uwag w swoim artykule: Wszystko , co chciałeś wiedzieć o tworzeniu funkcji bezpiecznego resetowania hasła . Najważniejsze fragmenty to:
[T] oto dwa popularne podejścia:
- Wygeneruj nowe hasło na serwerze i wyślij je e-mailem
- Wyślij e-mail z unikalnym adresem URL, który ułatwi proces resetowania
Pomimo wielu przeciwnych wskazówek, pierwszy punkt tak naprawdę nie jest tym, gdzie chcemy być. Problem polega na tym, że oznacza to, że trwałe hasło - takie, którego możesz użyć w dowolnym momencie - zostało wysłane przez niezabezpieczony kanał i znajduje się w Twojej skrzynce odbiorczej.
...
Ale jest jeszcze jeden duży problem z pierwszym podejściem, ponieważ sprawia, że złośliwa blokada konta jest banalnie prosta. Jeśli znam adres e-mail osoby, która jest właścicielem konta w witrynie internetowej, mogę zablokować jej dostęp w dowolnym momencie, po prostu resetując hasło; to atak typu „odmowa usługi” podany na srebrnym talerzu! Dlatego reset jest czymś, co powinno nastąpić dopiero po pomyślnym zweryfikowaniu prawa żądającego do tego.
Kiedy mówimy o resetowanym adresie URL, mówimy o adresie strony internetowej, który jest unikalny dla tego konkretnego wystąpienia procesu resetowania.
...
Chcemy stworzyć unikalny token, który można wysłać w wiadomości e-mail jako część adresu URL resetowania, a następnie dopasować z powrotem do rekordu na serwerze obok konta użytkownika, potwierdzając w ten sposób, że właściciel konta e-mail jest rzeczywiście tym, który próbuje zresetować hasło. Na przykład token może mieć postać „3ce7854015cd38c862cb9e14a1ae552b” i jest przechowywany w tabeli obok identyfikatora użytkownika przeprowadzającego reset i czasu, w którym token został wygenerowany (więcej o tym za chwilę). Wysyłana wiadomość e-mail zawiera adres URL, na przykład „Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b”, a gdy użytkownik go wczyta, strona sprawdza istnienie tokena, a następnie potwierdza tożsamość użytkownika i zezwala na hasło zmienić się.
...
Inną rzeczą, którą chcemy zrobić z adresem URL resetowania, jest ograniczenie czasu tokena, tak aby proces resetowania musiał zostać zakończony w określonym czasie, powiedzmy w ciągu godziny.
...
Wreszcie, chcemy mieć pewność, że jest to jednorazowy proces. Po zakończeniu procesu resetowania token należy usunąć, aby adres URL resetowania nie działał. Podobnie jak w poprzednim punkcie, ma to na celu zapewnienie atakującemu bardzo ograniczonego okna, w którym może nadużywać adresu URL resetowania. Oczywiście token nie jest już wymagany, jeśli proces resetowania zakończył się pomyślnie.
Podaje o wiele więcej dobrych punktów dotyczących unikania wycieków informacji, CAPTCHA, uwierzytelniania dwuskładnikowego i oczywiście podstawowych najlepszych praktyk, takich jak haszowanie haseł. Myślę, że ważne jest, aby zauważyć, że nie zgadzam się z Troyem co do użyteczności pytań bezpieczeństwa, preferując sceptycyzm Bruce'a Schneiera w tej praktyce :
Cel wszystkich tych pytań jest taki sam: hasło zapasowe. Jeśli zapomnisz hasła, tajne pytanie może zweryfikować twoją tożsamość, dzięki czemu będziesz mógł wybrać inne hasło lub poprosić witrynę o przesłanie Ci aktualnego hasła e-mailem. To świetny pomysł z punktu widzenia obsługi klienta - jest mniej prawdopodobne, że użytkownik zapomni imienia swojego pierwszego zwierzaka niż jakieś przypadkowe hasło - ale straszne dla bezpieczeństwa. Odpowiedź na tajne pytanie jest znacznie łatwiejsza do odgadnięcia niż dobre hasło, a informacje są znacznie bardziej publiczne.