Вопрос по форме восстановления пароля на сайте

Сделали формочку с полем для ввода почты и кнопкой «Восстановить пароль».

При нажатии на нее на почту (если такая есть в базе) отправляется ссылка вида
site.ru/fastlogin/name@mail.ru/823497378934270324789543

По ссылке мы определяем совпадает ли почта и хеш пароля (823497378934270324789543) с данными учетки. Если да, то человек автоматически входит на сайт. То есть перешел по ссылке и уже залогинен.

Вроде бы все очень легко и удобно. Но чувствуется что тут есть какие-то подводные камни. Может быть вы увидите их?
  • Вопрос задан
  • 4961 просмотр
Решения вопроса 1
g0lden
@g0lden
Нужно запоминать в базе когда сгенерированна подобная ссылка, и придерживаться некого TTL для нее, мне доводилось анализировать как часто пользователи восстанавливают пароль (на примере интернет магазина), в 99% случаев происходит так: заходим на сайт, не помним пароль или логин, идем в форму восстановления, пишем там свой мэил, и тут же идем в почту ждать ссылку.

Т.е. при «сроки годности» такой ссылки скажем в 1 час, все должно без проблем работать, и не дать шанса сбрутфорсить хэш пароля.

Ну и само собой если пользователь не ткнулся на сайте в «восстановить пароль» то никакого TTL в базе не будет, а значит это защит от генерации подобных ссылок с парами почта\хэш пароля.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
BuriK666
@BuriK666
Компьютерный псих
Это должен быть не хэш пароля, а случайный набор символов, который генерируется при нажатии «восстановить пароль» и у которого определенный срок годности.

Такая ссылка может попасть в history браузера и т.п. (помните про попадание в поисковики ссылок на заказы в инет-магазинах?)
Ответ написан
Комментировать
Genome_X
@Genome_X
Только если пробовать брутфорсить хеш, т.е. осуществлять множественные переходы по сгенерированным ссылкам, в котором необходимый нам е-мейл как константа, а хеш каждый раз генерируется.
Тут можно придумать некие ограничения на количество хешей для конкретного е-мейла, т.е. три хеша в час для одного мейла, все что выше, считается попытко взлома.
Ответ написан
Комментировать
@Tsivarev
А как то фиксируется тот факт, что пользователь хочет восстановить пароль? Т. е. нажал кнопку «Восстановить пароль» на сайте?
Ответ написан
Комментировать
serverok
@serverok
Могу описать реализацию на одном из наших проектов:

1) пользователь вводит email;

1.1) проверяем существование данного аккаунта;

2) на почту отсылаем линк с уникальным сгенерированным идентификатором (который привязан к аккаунту), кликнув по которому, пользователь попадет на страницу с 2 полями для ввода — новый пароль и подтверждение.

3) при сабмите формы — записываем хеш нового пароля в поле временного пароля и отсылаем на почту пользователя ссылку для подтверждения данной операции (смену пароля).

4) у ссылки есть «время жизни» (у нас 6 часов) — если пользователь за это время перешел по ссылке, заменяем хеш пароля на новый и, вуаля, у пользователя новый пароль.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы