Трой Хант делает несколько замечательных замечаний в своей статье « Все , что вы когда-либо хотели знать о создании функции безопасного сброса пароля» . Наиболее значимые выдержки:
[T] вот два общих подхода:
- Создайте новый пароль на сервере и отправьте его по электронной почте
- Отправить уникальный URL, который облегчит процесс сброса
Несмотря на множество указаний на обратное, первый момент - это не то, где мы хотим быть. Проблема заключается в том, что это означает, что постоянный пароль - пароль, к которому вы можете вернуться и использовать в любое время - теперь был отправлен по небезопасному каналу и находится в вашем почтовом ящике.
...
Но есть еще одна большая проблема с первым подходом в том, что он делает простую злонамеренную блокировку учетной записи. Если я знаю адрес электронной почты того, кто владеет учетной записью на веб-сайте, я могу заблокировать его в любое время, просто сбросив его пароль; это атака отказа в обслуживании на серебряном блюде! Вот почему сброс должен происходить только после успешной проверки права запрашивающего сделать это.
Когда мы говорим об URL сброса, мы говорим об адресе веб-сайта, который уникален для этого конкретного случая процесса сброса.
...
Мы хотим создать уникальный токен, который можно отправить по электронной почте как часть URL-адреса сброса, а затем сопоставить с записью на сервере вместе с учетной записью пользователя, таким образом подтверждая, что владелец учетной записи электронной почты действительно пытается сбросить пароль. Например, токен может быть «3ce7854015cd38c862cb9e14a1ae552b» и храниться в таблице вместе с идентификатором пользователя, выполняющего сброс, и временем, когда токен был сгенерирован (подробнее об этом чуть позже). Когда электронное письмо отправляется, оно содержит URL-адрес, такой как «Сброс /? Id = 3ce7854015cd38c862cb9e14a1ae552b», и когда пользователь загружает его, страница проверяет наличие токена и, следовательно, подтверждает личность пользователя и позволяет паролю быть изменен.
...
Другая вещь, которую мы хотим сделать с URL-адресом сброса, - ограничить токен по времени, чтобы процесс сброса был завершен в течение определенной продолжительности, скажем, в течение часа.
...
Наконец, мы хотим убедиться, что это одноразовый процесс. После завершения процесса сброса токен следует удалить, чтобы URL-адрес сброса больше не работал. Как и в предыдущем пункте, это означает, что у злоумышленника есть очень ограниченное окно, в котором он может использовать URL сброса. Кроме того, токен больше не требуется, если процесс сброса завершен успешно.
Он делает еще много хороших замечаний о том, как избежать утечек информации, CAPTCHA, двухфакторной аутентификации и, конечно же, основных рекомендаций, таких как хеширование паролей. Я думаю, что важно отметить, что я не согласен с Троем в отношении полезности вопросов безопасности, предпочитая скептицизм Брюса Шнайера в этой практике :
Суть всех этих вопросов одна и та же: резервный пароль. Если вы забыли свой пароль, секретный вопрос может подтвердить вашу личность, чтобы вы могли выбрать другой пароль или попросить сайт отправить вам текущий пароль по электронной почте. Это отличная идея с точки зрения обслуживания клиентов - пользователь с меньшей вероятностью забудет имя своего первого питомца, чем какой-то случайный пароль - но ужасен для безопасности. Ответ на секретный вопрос угадать гораздо проще, чем хороший пароль, а информация гораздо более общедоступна.