Zend Framework no tiene una clase generadora de contraseñas. He aquí un artículo sobre cómo utilizar el módulo PEAR Text_Password
para generar una contraseña: https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/howdoi/?p=118
Sin embargo, no es una buena práctica de seguridad para enviar la contraseña en un correo electrónico normal. En su lugar, debe restablecer su cuenta para que puedan iniciar sesión temporalmente sin dar una contraseña (dado que la URL que expira los envía en el correo electrónico), y una vez que inicien sesión, solicite que actualicen su propia contraseña a algo que ellos saben. Luego, almacene el hash salado de su contraseña.
Aquí hay algunos indicios de la parte superior de la cabeza para hacer esto en Zend Framework:
- definir una tabla
AccountReset
con campos: reset_id
(clave primaria GUID), account_id
(referencia a Accounts.account_id
), y expiration
(marca de tiempo).
- Implementar una acción llamada
AccountController::resetAction()
, es decir, en el mismo controlador que utiliza para la creación de cuentas, iniciar la sesión, el cambio de contraseñas, etc.
- Cuando un usuario elige para restablecer su cuenta, insertar una nueva fila en una tabla con un
AccountReset
nuevo GUID, una referencia a la cuenta del usuario, y un expiration
30 minutos más o menos en el futuro.
- Envíe un correo electrónico a la dirección que figura en el archivo para ese usuario, incluyendo una URL en la que debe hacer clic: "https .../account/reset/reset_id/
<
GUID >
" (si es inteligente con reglas de enrutamiento, puede acortar esa URL, pero mantener el GUID en ella).
- Cuando
AccountController::resetAction()
recibe la solicitud, busca su parámetro reset_id
en la tabla AccountReset
. Si ese GUID existe y el tiempo expiration
no ha transcurrido, presente al usuario un formulario para cambiar su contraseña (sin necesidad de que esté autenticado e ingresado).
- Si
resetAction()
recibe una solicitud sin GUID, o el GUID no existe en la base de datos, o esa fila ha pasado su expiration
, esta acción puede presentar al usuario un botón para iniciar una nueva solicitud de reinicio, y envíe un correo electrónico con un nuevo GUID. ¡Recuerde hacer de este botón una solicitud POST!
Como el GUID se comunica solo por correo electrónico a la dirección de ese usuario, nadie más puede obtener acceso para cambiar la contraseña. Incluso si el correo electrónico del usuario es interceptado, solo hay un tiempo limitado para que el GUID otorgue ese acceso.
Si quiere ser aún más cauteloso, puede anotar la dirección IP del cliente en la tabla AccountReset
, y solicitar que se cambie la contraseña de un cliente con la misma dirección IP, dentro de esa ventana de 30 minutos.
Esto es solo improvisado, y no lo he implementado ni evaluado para garantizar la seguridad. Si usted es responsable de implementar la seguridad, es su deber leer sobre cuestiones de seguridad. Un recurso bien considerado para la seguridad de PHP es http://phpsecurity.org/.
Awesome response! Eso es muy útil. ¡Gracias! – Andrew
Mi única otra pregunta sería ... ¿Tendría que generar un número aleatorio para el GUID? Por lo tanto, volviendo a mi pregunta original de cómo hacer eso. Además, ¿cómo debo hacer para garantizar que el GUID sea único en la base de datos? – Andrew
Genera UUID en PHP con la función uniqid(): http://php.net/uniqid –