По-перше, нам потрібно знати, що ви вже знаєте про користувача. Очевидно, у вас є ім’я користувача та старий пароль. Що ще ви знаєте? У вас є електронна адреса? Чи є у вас дані щодо улюбленої квітки користувача?
Якщо припустити, що у вас є ім’я користувача, пароль та робоча електронна адреса, вам потрібно додати два поля до вашої таблиці користувачів (якщо це припустимо, що це таблиця бази даних): дату з назвою 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>
Якщо ви не вимагали скидання пароля, ви можете проігнорувати цей електронний лист.
Дякую, яда яда
Тепер кодування yourcript.lang: Цей сценарій потребує форми. Якщо оновлення var передано за URL-адресою, форма просто запитує ім’я користувача та електронну адресу користувача. Якщо оновлення не передано, він запитує ім’я користувача, електронну адресу та ідентифікаційний код, надіслані в електронному листі. Ви також запитуєте новий пароль (звичайно, двічі).
Щоб перевірити новий пароль користувача, ви підтверджуєте, що ім’я користувача, електронна адреса та ідентифікаційний код збігаються, що запит не минув та що два нових паролі збігаються. У разі успіху ви зміните пароль користувача на новий і очистите поля скидання пароля з таблиці користувачів. Також не забудьте вийти з користувача / очистити всі файли cookie, пов’язані з входом, і перенаправити користувача на сторінку входу.
По суті, поле new_passwd_id - це пароль, який працює лише на сторінці скидання пароля.
Одне з можливих покращень: ви можете видалити <ім'я користувача> з електронного листа. "Хтось вимагає скидання пароля для облікового запису за цією електронною адресою ...." Таким чином, роблячи ім'я користувача тим, що лише користувач знає, чи електронний лист перехоплюється. Я не починав з цього шляху, тому що якщо хтось атакує рахунок, він вже знає ім’я користувача. Ця додаткова неясність зупиняє атаки можливостей "посередині", якщо хтось зловмисний перехопить електронну пошту.
Щодо ваших питань:
генерація випадкового рядка: він не повинен бути надзвичайно випадковим. Достатньо будь-якого генератора GUID або навіть md5 (concat (salt, current_timestamp ())), де сіль є чимось на записі користувача, наприклад, був створений рахунок часу. Це має бути те, що користувач не бачить.
таймер: Так, це потрібно для того, щоб зберегти свою базу даних у здоровому стані. Насправді потрібно не більше тижня, але принаймні 2 дні, оскільки ви ніколи не знаєте, скільки може тривати затримка електронної пошти.
IP-адреса. Оскільки електронна адреса може затримуватися на дні, IP-адреса корисна лише для реєстрації, а не для перевірки. Якщо ви хочете зареєструвати його, зробіть це, інакше це вам не потрібно.
Екран скидання: Див. Вище.
Сподіваюся, що це покриває. Удачі.