Забыли пароль — какие поля я должен добавить?

#php #mysql

#php #mysql

Вопрос:

Я работаю над функцией «Забыли пароль».

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

токен будет выглядеть примерно так:

 http://www.domain.com/account/resetpassword/4u240238402348239048092384908239080
 

Если пользователь нажмет на эту ссылку, он будет искать хэш-токен из пользовательской users таблицы. Если найдено, то покажите текстовые поля для смены пароля.

Я буду использовать hash("sha256",...) функцию для генерации хэша.

Как хэш должен храниться в users таблице?

Нужно ли добавлять такие поля, как «reset_hash» и «reset_date»?

Комментарии:

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

Ответ №1:

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

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

Комментарии:

1. Каким должно быть значение хэша сброса и метки времени, когда пароль был изменен? полагаю, в null / blank?

2. @user791022: Да, любой из них будет работать. Просто убедитесь, что пользователь не может перейти http://www.domain.com/account/resetpassword/ и выполнить сброс пароля для пользователей, чьи хэши и пустые / НУЛЕВЫЕ.

Ответ №2:

Да, это хорошая идея хранить эти поля в таблице users. Вы можете проверить правильность хэша и заблокировать его, установив reset_date на фактическую дату и время. Может быть, неплохо также сохранить поле expire_date.

Ответ №3:

Сохраните хэш как varchar(256), и вам, вероятно, понадобится дата запроса, я бы просто использовал поле int для хранения time() при получении запроса, чтобы вы могли просто выполнить time() — {dbtime}, и если оно превышает определенное значение, то запрос был выполнен по времени вон.

РЕДАКТИРОВАТЬ: как указано выше, вы должны установить для обоих этих полей значение NULL после завершения запроса.

Ответ №4:

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

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