PHP отправить пароль пользователя по электронной почте
Мы все знаем, что не должны хранить пароли пользователей в виде простого текста в базе данных. Однако я видел несколько сайтов, которые реализовали функцию отправки забытого пароля. Поэтому, если я спрашиваю свой пароль, я набираю свою электронную почту, и они отправляют пароль. Примечание. Я не говорю об изменении пароля ( http://sample.com/forgot_pass?token=ddm39fhksnc)
Как эти сайты достигают этого? Они хранят простые пароли в своих базах данных (возможно, в другой базе данных), потому что, насколько я знаю, вы не можете изменить хеш пароля на исходную строку, из которой он был построен...
Есть ли в любом случае эта функция может быть реализована безопасно? Или я должен убедить клиентов придерживаться метода забытого пароля.
Благодарю.
4 ответа
Такая функция не может быть реализована безопасно. Если приложение может получить исходный пароль (например, из зашифрованного пароля), успешный злоумышленник также может получить пароли. Вот почему следует использовать хэш-функции, такие как BCrypt, SCrypt или PBKDF2.
Еще одним недостатком является отправка пароля вообще по электронной почте. Лучший способ - отправить токен и позволить пользователю выбрать свой пароль после подтверждения. Этот же код может быть использован для регистрации нового пользователя и сброса пароля.
Если они могут выслать вам ваш пароль, то они хранят ваш пароль в виде простого текста.
Обратите внимание, что вы можете узнать исходный пароль из хеша, если использовалась устаревшая хеш-функция (например, md5).
Нет способа сделать это безопасно. Если ваша база данных будет взломана, злоумышленник сможет прочитать все пароли и соответствующие адреса электронной почты / имена пользователей. Если ваши пользователи повторно используют один и тот же пароль для разных сайтов (что делает большинство людей), что может произойти.
Даже если бы существовал "безопасный" способ узнать пароль из его хеша, что мешает злоумышленнику сделать то же самое?
Мое решение - добавить два поля в таблицу "user" в моей базе данных: поле "token" и поле "expired_time".
Когда пользователь отправляет запрос на сброс пароля, ваше приложение обновит строку токена и истекло время для сброса пароля для этого пользователя.
Отправить письмо со ссылкой имеет имя пользователя (или адрес электронной почты, или идентификатор,...) и токен, как http://example.com/resetpassword.php?id=userid&token=token
В файле resetpassword.php вы будете проверять аутентификацию по идентификатору пользователя, токену и истекшему времени (возможно, 5 минут).
Разрешить пользователю менять свой пароль.
Это моё решение, надеюсь, оно поможет:)
Вы открываете дверь к серьезным проблемам безопасности, если сохраняете фактический пароль в базе данных. Но если на самом деле вы должны повторно отправить им пароль, вы могли бы это сделать, когда они регистрируются, сохраните пароль в текстовом файле, расположенном за пределами общедоступного каталога.
Затем создайте некоторую логику именования, которая связывает запись с текстовым файлом. А затем оттуда сделайте так, чтобы единственный доступ к этому текстовому файлу был только при наличии надлежащих проверок безопасности, а затем через ваш скрипт.