Собственно сабж. Мне необходимо реализовать у себя на сайте функцию сброса пароля.
Раньше никогда это делать не приходилось, поэтому хочу у Вас узнать как сделать правильно с точки зрения безопасности.
P.S: Или если это расписывать очень долго, то подкиньте пожалуйста какие-нибудь статьи на этот счет. Наверняка тема уже избита.
Рекомендую такой вариант:
1. Пользователь запрашивает восстановление пароля
2. Шлём ему на почту письмо со специальной ссылкой, содержащей токен
3. Пользователь переходит по ссылке из письма
4. Сверяем токен, после чего авторизуем его и даем задать новый пароль
5. Сохраняем хеш пароля в БД
Тонкости:
— Токен — достаточно длинная строка из случайных символов
— У токена должен быть срок действия, например 1 час. Это обезопасит систему от перебора токенов
А зачем авторизировать? Смена пароля может быть только по однаразовому токену, либо с подтверждением старого пароля. Как бы не осталась после этого быра в виде смены пароля для авторизированного пользователя.
И ещё тонкий момент на который редко, но попадаешь — ссылка долдна вести на форму с кнопкой по нажатию которой посылается пост запрос. Есть ребята которые используют плагины, которые в фоне шастают по ссылкам и проверяют их на вирусы или собирабт статистику, поэтому гет запрос не должен менять статуса и забывать токен.
Авторизация — это действие ради которого пользователь и восстанавливает пароль. Если пользователь перешел по ссылке из письма, и так понятно, что он это он, мы же ему доверяем менять свой пароль.
Если авторизацию после сброса не делать, пользователю придется еще раз вводить свой логин и пароль.
В добавок посоветую сделать не один токен на пользователя, а связанную таблицу (user<-token). Бывает ситуация, когда требуется несколько токенов. Например, смена E-Mail (да, можно выслать токен, запросить новый email, выслать новый токен на новый email, но это неудобно). Это позволит сделать систему подтверждения более гибкой
С одной стороны авторизуя до смены пароля, вы даете возможность пользователю работать с сайтом фактически без авторизации, да и про смену пароля он может забыть — ведь зачем ему что-то менять, когда он и так авторизовался. Но с другой стороны — зачем тогда нужны пароли и их восстановление, когда человек может войти по такой ссылке из письма. Может вообще делать авторизацию только по ссылке из письма?
1. пользователь вводит мыло, вы отправляете туда ссылку со сгенереным токеном
2. после перехода по ссылке из мыла или даете ввести новый пароль, или опять таки шлете на мыло заново сгенерированный пароль