Сначала нам нужно узнать, что вы уже знаете о пользователе. Очевидно, у вас есть имя пользователя и старый пароль. Что еще ты знаешь? У вас есть адрес электронной почты? У вас есть данные о любимом цветке пользователя?
Предполагая, что у вас есть имя пользователя, пароль и рабочий адрес электронной почты, вам необходимо добавить два поля в вашу таблицу пользователей (предположим, что это таблица базы данных): дата с именем new_passwd_expire и строка new_passwd_id.
Если у вас есть адрес электронной почты пользователя, когда кто-то запрашивает сброс пароля, вы обновляете таблицу пользователей следующим образом:
new_passwd_expire = now() + some number of days
new_passwd_id = some random string of characters (see below)
Далее вы отправляете электронное письмо пользователю по этому адресу:
Дорогой такой-то
Кто-то запросил новый пароль для учетной записи пользователя на <имя вашего сайта>. Если вы запрашивали сброс пароля, перейдите по этой ссылке:
http://example.com/yourscript.lang?update=>
Если эта ссылка не работает, вы можете перейти к http://example.com/yourscript.lang и ввести в форму следующее:
Если вы не запрашивали сброс пароля, вы можете проигнорировать это письмо.
Спасибо, Яда Яда
Теперь кодируем yourscript.lang: для этого скрипта нужна форма. Если обновление var передается по URL, форма просто запрашивает имя пользователя и адрес электронной почты. Если обновление не прошло, он запрашивает имя пользователя, адрес электронной почты и идентификационный код, отправленный в электронном письме. Вы также просите новый пароль (дважды, конечно).
Чтобы проверить новый пароль пользователя, убедитесь, что имя пользователя, адрес электронной почты и идентификационный код совпадают, что срок действия запроса не истек, а два новых пароля совпадают. В случае успеха вы меняете пароль пользователя на новый и очищаете поля сброса пароля из пользовательской таблицы. Также не забудьте выйти из системы / удалить все файлы cookie, связанные с входом, и перенаправить пользователя на страницу входа.
По сути, поле new_passwd_id является паролем, который работает только на странице сброса пароля.
Одно потенциальное улучшение: вы можете удалить из электронного письма. «Кто-то запросил сброс пароля для учетной записи на этом адресе электронной почты ...» Таким образом, делая имя пользователя чем-то, что знает только пользователь, перехватывается ли электронная почта. Я не начинал таким образом, потому что, если кто-то атакует аккаунт, он уже знает имя пользователя. Эта добавленная неясность останавливает атаку «человек посередине» в случае, если кто-то злоумышленник перехватит электронную почту.
Что касается ваших вопросов:
генерация случайной строки: она не должна быть чрезвычайно случайной. Достаточно любого генератора GUID или даже md5 (concat (salt, current_timestamp ())), где salt - это что-то в записи пользователя, например, была создана учетная запись timestamp. Это должно быть что-то, что пользователь не может видеть.
таймер: Да, это нужно просто для того, чтобы ваша база данных была в здравом уме. Требуется не больше недели, но как минимум 2 дня, поскольку вы никогда не знаете, как долго может длиться задержка электронной почты.
IP-адрес: поскольку электронная почта может быть отложена на несколько дней, IP-адрес полезен только для регистрации, а не для проверки. Если вы хотите войти, сделайте это, иначе вам это не нужно.
Экран сброса: см. Выше.
Надеюсь, что это покрывает. Удачи.