PHP - Как реализовать сброс пароля и срок действия токена - PullRequest
17 голосов
/ 02 июля 2010

Я хочу настроить скрипт восстановления пароля php, используя токен, срок действия которого истекает через 24 часа. Но я не уверен, как это сделать. На данный момент у меня есть SHA1 зашифрованные пароли пользователей. Все, что я хочу сделать, я думаю, это добавить токен к URL, который отправляется пользователю, когда он запрашивает сброс пароля. Но как мне сделать это правильно и что мне нужно хранить в базе данных?

Ответы [ 4 ]

35 голосов
/ 02 июля 2010
  1. Когда ваш пользователь запрашивает сброс пароля, сгенерируйте токен и вычислите его срок действия
  2. Сохраните токен и дату его окончания в отдельных столбцах в вашей таблице пользователей для этого пользователя
  3. Отправьте электронное письмо пользователю, содержащему ссылку сброса, с токеном, добавленным к его URL-адресу
  4. Когда ваш пользователь перейдет по ссылке, получите токен из своего URL-адреса (возможно, с помощью $_GET['token'])
  5. Проверьте токен в таблице пользователей
  6. Убедитесь, что срок его действия еще не истек
    • Если срок его действия истек, аннулируйте его, возможно, очистив поля и разрешив пользователю повторно отправить
  7. Если токен действителен и пригоден для использования, предоставьте пользователю форму сброса пароля
  8. Проверьте и обновите пароль, очистите поля токена и срок действия
9 голосов
/ 02 июля 2010

Я бы вообще не использовал базу данных.Но вместо этого используется одностороннее шифрование.
Просто отправьте необходимую информацию по гиперссылке, поставляемой в письме, подписанной хешем.Примерно так:

$token = sha1($user_id.$time.$user_pass.$salt).dechex(time()).dechex($user_id);
$link = "http://".$domain."/restorepass/?token=$token";

Получив его, просто разделите и декодируйте его, а затем проверьте хэш и тайм-аут.

3 голосов
/ 02 июля 2010

Вам необходимо сохранить уникальный токен и метку времени истечения токена.Когда пользователи посещают уникальный URL-адрес, вы должны проверить токен, имя пользователя и метку времени истечения токена.Если все в порядке, вы можете отправить новый пароль или отобразить форму, где пользователь может установить новый пароль.

0 голосов
/ 02 июля 2010

Я хотел бы сделать это, настроив другую базу данных с именем pessword_reset_sessions.

, чтобы вы могли хранить следующее:

userid generalhash userhash timeinititated попытки

затем с пользователемid вы isnert идентификатор пользователя obv, с общим хешем - это хеш, который НЕ показывается пользователю, но используется для создания хеша пользователя.

timeinitiated должно быть меткой времени UNIX, когда он впервые запросил новый пароль.

как только вы подтвердите, что пользователь, запрашивающий пароль, ввел информацию для проверки, такую ​​как электронная почта, имя, секретный вопрос.вы создаете строку в таблице сброса пароля.

и выдаете электронное письмо, содержащее хэш пользователя.

когда хэш возвращается через $_GET['hash'], вы затем создаете другой хеш из generalhash для сравнения с хешем, который приходит через $ _GET [], если хеш не совпадает, вы увеличиваете attempts

, который вы также можете проверить перед тем, чтобы убедиться, что он не отключил защиту на 2много попыток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...