Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Как правильно сгенерировать ссылку для восстановления пароля?

#безопасность #php #отправка #шифрование #восстановление


Здравствуйте!
Пишу скрипт восстановления пароля для сайта. 
Принцип работы следующий:

Пользователь вводит email
Получает письмо
Проходит по ссылке
Вводит новый пароль

Но я не знаю как защитить ссылку, которую отсылаю на email и что вообще можно и нужно
в ней передать!!
Подскажите пожалуйста, как можно это реализовать?
Пока додумался до такого варианта:
Получаю Email, проверяю есть ли он в базе.
Затем логин, пароль, email беру в одну строку, кодирую в md5().
$str = md5($login.$pass,$email);

Отправляю письмо со ссылкой: www.сайт.ru?getPass=$str
Далее я так понимаю, нужно создать базу данных, чтобы туда поместить $str, ведь когда
я её получу ?getPass=$str , мне надо будет её сравнить...
Ну а в таблице соответственно указать дату, чтобы например через сутки удалить, если
пользователь не перешел по ссылке.
Ну вот, я бы сделал так, но мне хотелось бы чтобы более опытные программисты подсказали
как лучше    


Ответы

Ответ 1



Да, Вы правы, $str можно сгенерировать случайным образом, я в общем сделал следующее: закодировал строку в md5()? создал базу данных в которую поместил это значение, и когда пользователь проходит по закодированной ссылке, я сверяю её с базой данных, и если есть совпадения, выдаю форму для заполнения нового пароля!!!

Ответ 2



А я бы создал отдельную табличку или дополнительные записи. Например табличка Pass_recovery с полями user_id, access_hash, expires. user_id - id юзверя (внешний ключ) access_hash - произвольный md5() или sha1() хэш доступа, любой, пусть даже md5(time()) expires - например 1 час с момента запроса на восстановление пароля Потом на email слать ссылку типа: www.site.com?=recovery_id=$user_id&recovery_hash=$access_hash Скриптом по recovery_id мы быстро находим из таблицы Pass_recovery значения и сверяем recovery_id == user_id и recovery_hash == access_hash. Быстро, так как это по идее должен быть индекс в таблице! Если проверка успешная то предлагаем юзверю ввести пароль прямо на сайте. После этого очистить accessHash в таблице.

Ответ 3



$str = dechex(time()).md5(uniqid($email)); md5(uniqid($email)) - защита от подбора dechex(time()) - защита от коллизий хешей Для дополнительной защиты в базу также сохранять и при проверке ссылки сверять IP адрес клиента и возможно User Agent браузера.

Комментариев нет:

Отправить комментарий