Как я могу обеспечить безопасный способ сброса пароля?

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

Это процесс, который в настоящее время действует:

Шаг 1 : Пользователь нажимает ссылку «Забыли пароль» на веб-сайте.
Шаг 2 : Пользователь вводится в форму и дважды вводит адрес электронной почты перед отправкой электронной почты.
Шаг 3 : Email содержит ссылку на другую форму, где пользователь может дважды ввести новый пароль для подтверждения. После ввода второй формы система вставляет новую запись в мою таблицу Recover_Password в базе данных, которая содержит столбцы «id», «токен», «created_at» и «expires_at».

Это ссылка -> (mywebsitename) .com / form? Id = 99999 & token =
Где «id» – это идентификатор пользователя, а «токен» генерируется из do_hash($id . date('Ym-d'))

Шаг 4 : Пользователь заполняет форму и выводится на страницу входа в систему. Система очищает маркерную запись из базы данных и обновляет текущий пароль пользователя из таблицы пользователя.

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

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

Related of "Как я могу обеспечить безопасный способ сброса пароля?"

Безопасный способ обработки сбрасываемых паролей может выглядеть так:


Запрос на сброс пароля:

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

  2. Ваше приложение проверяет наличие электронной почты в вашей базе данных. Если он существует, он создает токен, который должен быть случайным и не утомленным из информации, такой как идентификатор пользователя или временная метка. Хэш жетона будет храниться в базе данных в отдельной таблице вместе с идентификатором пользователя и датой истечения срока действия. Ссылка на токен отправляется пользователю по электронной почте.

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

Восстановление пароля:

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

  2. После подачи формы приложение проверяет его токен. Если он соответствует и не истек, пароль может быть изменен, и пользователь может войти в систему напрямую (вы можете оставить ему форму для входа в систему). Наконец, токен должен быть деактивирован, я сам предпочитаю хранить запись, поэтому я могу сообщить пользователю, что токен уже использовался, когда он снова нажимает ссылку.

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

  • Вы используете хэш-код с хэш-алгоритмом, таким как SHA512 без соли. Это безопасно, если токен очень сильный (минимальная длина 20 с 0-9 az AZ). Теоретически вам нужно проверить, существует ли такой хеш, прежде чем вводить его в базу данных, на практике это незначительно. Я применил класс сброса пароля, который может обрабатывать такие токены.

  • У вас есть знак с BCrypt и солью. Это позволяет использовать более короткие токены, но вы не можете искать хешированный токен в базе данных. Вместо этого вы должны указать идентификатор строки в ссылке, чтобы найти токен.