Как я могу безопасно предоставить пользователю новый пароль в веб-приложении PHP / MySQL? - PullRequest
2 голосов
/ 20 марта 2011

У меня простой вопрос.Каков наилучший способ восстановления пароля для пользователя?

Я хочу, чтобы пользователь мог щелкнуть ссылку типа «забыть пароль»?При нажатии пользователь получит электронное письмо с новым паролем.

Я думаю, что отправка хеша - плохая опция, тогда я должен сгенерировать случайный пароль, преобразовать в хеш + случайную соль, заменить его вбазы данных и отправить новый случайный пароль по электронной почте.Это лучший способ или есть другой?Чем проще, тем лучше.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 20 марта 2011

Самый безопасный способ - отправить человеку по электронной почте ссылку на страницу, которая позволяет ему создать новый пароль. Пароли должны храниться только как соленые хэши. Нарушение этого процесса потребует компрометации электронной почты человека - в этом случае у него, вероятно, проблемы хуже, чем скомпрометированный пароль к вашему веб-приложению.


Файлы и таблицы:

Я полагаю, что ваша база данных содержит таблицу с именем "users" со столбцом "userid", который служит ее первичным ключом.

  1. Создайте новую таблицу в вашей табазе с именем password_reset с тремя столбцами: userid, который является внешним ключом, указывающим на таблицу users; code, который будет содержать уникальное случайное число; и timestamp, в котором будет указана дата отправки запроса.

  2. Создайте страницу для сброса пароля, например password_reset_request.php. Спросите имя пользователя или адрес электронной почты.

  3. Создать страницу для установки нового пароля, например set_new_password.php.

Логика:

  1. Если имя пользователя или адрес электронной почты, указанные для password_reset_request.php, верны, вставьте строку в таблицу password_reset, соответствующую запросу. Представьте, что пользователь Fel разместил запрос на сброс пароля. Fel внутренний userid может быть 564979 . Строка в password_reset будет выглядеть примерно так: 564979, 54c4a2767c2f485185ab72cdcf03ab59, 2011-01-01 12:00:00.

  2. Отправьте электронное письмо на адрес электронной почты пользователя с URL-адресом, похожим на это: http://your.url/set_new_password.php?userid=564979&code=54c4a2767c2f485185ab72cdcf03ab59.

  3. Когда set_new_password.php получает попадание, он должен проверить наличие свойств userid и code в URL. Не там? Прервать.

  4. Очистите свойства userid и code, если они там есть. Это важно.

  5. Запустите команду SQL следующим образом: SELECT * FROM password_reset pr WHERE pr.userid = $userid AND pr.code = $code AND TIMESTAMPDIFF(DAY, CURTIME(), pr.timestamp) < 1.

  6. Если вы не получили результатов, Прервать.

  7. Если вы получили результат, разрешите пользователю ввести новый пароль.

  8. После проверки пароля, как обычно при регистрации, используйте оператор SQL UPDATE для изменения пароля пользователя.

  9. Использование SQL для удаления любых запросов пользователя из таблицы password_reset: DELETE * FROM password_reset WHERE userid = $userid.

Готово!

0 голосов
/ 20 марта 2011

Вам следует отправить по электронной почте ссылку на страницу с секретным вопросом (и уникальным кодом, чтобы люди не могли задавать вопросы безопасности других людей).

После ответа на вопрос разрешите пользователю создать новый пароль.

0 голосов
/ 20 марта 2011

Я бы сделал следующее

  1. Пользователь запрашивает сброс пароля
  2. Пользователь вводит либо имя пользователя, либо пароль
  3. Электронное письмо отправляется пользователю со ссылкой с уникальным хешем, который помещается в таблицу базы данных (например, pwrecovery) - эта ссылка будет выглядеть так: http://domain.com/pwrecover.php?key=KEYHERE
  4. Пользователь щелкает эту ссылку, если в таблице существует хеш, то ему отправляется еще одно электронное письмо с новым паролем.

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

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