Во-первых, нам нужно знать, что вы уже знаете о пользователе. Очевидно, у вас есть имя пользователя и старый пароль. Что еще ты знаешь? У вас есть адрес электронной почты? У вас есть данные о любимом цветке пользователя?
Предполагая, что у вас есть имя пользователя, пароль и рабочий адрес электронной почты, вам нужно добавить два поля в свою таблицу пользователей (если это таблица базы данных): дату с именем 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= < new_password_id >
Если эта ссылка не работает, вы можете перейти на http://example.com/yourscript.lang и ввести в форму следующее: <new_password_id>
Если вы не запрашивали сброс пароля, можете проигнорировать это письмо.
Спасибо yada yada
Теперь напишите код yourscript.lang: для этого скрипта нужна форма. Если обновление var передается по URL-адресу, форма просто запрашивает имя пользователя и адрес электронной почты. Если обновление не прошло, оно запрашивает имя пользователя, адрес электронной почты и идентификационный код, отправленные в электронном письме. Вы также просите новый пароль (дважды, конечно).
Чтобы проверить новый пароль пользователя, вы подтверждаете, что имя пользователя, адрес электронной почты и идентификационный код совпадают, срок действия запроса не истек и два новых пароля совпадают. В случае успеха вы меняете пароль пользователя на новый пароль и очищаете поля сброса пароля из таблицы пользователей. Также не забудьте вывести пользователя из системы / очистить все файлы cookie, связанные с входом в систему, и перенаправить пользователя на страницу входа.
По сути, поле new_passwd_id - это пароль, который работает только на странице сброса пароля.
Одно потенциальное улучшение: вы можете удалить <username> из письма. «Кто-то запросил сброс пароля для учетной записи на этом адресе электронной почты ...» Таким образом, имя пользователя будет известно только пользователю в случае перехвата электронной почты. Я не начал с этого, потому что если кто-то атакует учетную запись, они уже знают имя пользователя. Эта дополнительная скрытность предотвращает атаки типа «злоумышленник в середине» в случае, если кто-то злоумышленник перехватит электронную почту.
Что касается ваших вопросов:
генерация случайной строки: она не должна быть очень случайной. Достаточно любого генератора GUID или даже md5 (concat (salt, current_timestamp ())), где соль - это что-то в записи пользователя, например, была создана учетная запись timestamp. Это должно быть то, что пользователь не может видеть.
timer: Да, вам это нужно только для того, чтобы ваша база данных работала. На самом деле необходимо не более недели, но не менее 2 дней, поскольку никогда не знаешь, как долго может длиться задержка по электронной почте.
IP-адрес: поскольку электронное письмо может быть задержано на несколько дней, IP-адрес полезен только для регистрации, а не для проверки. Если вы хотите его зарегистрировать, сделайте это, иначе он вам не понадобится.
Экран сброса: см. Выше.
Надеюсь, что это покрывает его. Удачи.