Как создать случайный пароль или временный URL для сброса пароля в Zend Framework? - PullRequest
7 голосов
/ 16 апреля 2009

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

Каков наилучший процесс для этого? Как мне создать новый пароль? Есть ли в Zend Framework что-нибудь, что облегчит эту задачу?

Я также слышал об отправке электронного письма со ссылкой на кратковременную страницу, которая позволяет им установить новый пароль. Как это можно сделать с Zend Framework?

1 Ответ

22 голосов
/ 16 апреля 2009

Zend Framework не имеет класса, генерирующего пароли. Вот статья о том, как использовать модуль PEAR Text_Password для генерации пароля: https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/howdoi/?p=118

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


Вот несколько советов по поводу того, как сделать это в Zend Framework:

  • Определите таблицу AccountReset с полями: reset_id (первичный ключ GUID), account_id (ссылка на Accounts.account_id) и expiration (метка времени).
  • Реализовать действие под названием AccountController::resetAction(), т.е. на том же контроллере, который вы используете для создания учетных записей, входа в систему, смены паролей и т. Д.
  • Когда пользователь выбирает сброс своей учетной записи, вставьте новую строку в таблицу AccountReset с новым GUID, ссылкой на учетную запись пользователя и expiration 30 минут или около того в будущем.
  • Отправьте электронное письмо по адресу, указанному в файле для этого пользователя, включая URL-адрес, на который он должен нажать: «https ... / account / reset / reset_id / < GUID >» (если вы сообразительны с правила маршрутизации, вы можете сократить этот URL, но оставить в нем GUID).
  • Когда AccountController::resetAction() получает запрос, он ищет его параметр reset_id в таблице AccountReset. Если этот GUID существует и время expiration не прошло, предоставьте пользователю форму для изменения своего пароля (без необходимости аутентификации и входа в систему).
  • Если resetAction() получает запрос без GUID, или GUID не существует в базе данных, или эта строка прошла свой expiration, тогда это действие может вместо этого предоставить пользователю кнопку для запуска нового сбросить запрос и отправить письмо с новым GUID. Не забудьте сделать эту кнопку запросом POST!

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

Если вы хотите быть еще более осторожным, вы можете записать IP-адрес клиента в таблице AccountReset и потребовать изменения пароля от клиента с тем же IP-адресом в течение этого 30-минутного окна.

Это всего лишь секрет, и я не реализовал его и не оценил для обеспечения надлежащей безопасности. Если вы несете ответственность за обеспечение безопасности, вы обязаны ознакомиться с вопросами безопасности. Хорошо известный ресурс для обеспечения безопасности PHP: http://phpsecurity.org/.

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