2009-04-16 33 views
7

Tengo un proceso de autenticación básico que usa Zend_Auth_Adapter_DbTable. Tengo acciones de inicio de sesión y de cierre de sesión en mi Controlador de autenticación. Ahora quiero crear una función para restablecer las contraseñas olvidadas generando automáticamente una contraseña, guardando la nueva contraseña y enviándoles un correo electrónico con la contraseña recién generada.¿Cómo generar una contraseña aleatoria o URL temporal para restablecer la contraseña en Zend Framework?

¿Cuál sería el mejor proceso para hacer esto? ¿Cómo debería generar una nueva contraseña? ¿Zend Framework tiene algo que haría esto más fácil?

También he escuchado sobre el envío de un correo electrónico con un enlace a una página de corto plazo que les permite establecer una nueva contraseña. ¿Cómo podría hacerse esto con Zend Framework?

Respuesta

22

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/.

+0

Awesome response! Eso es muy útil. ¡Gracias! – Andrew

+0

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

+2

Genera UUID en PHP con la función uniqid(): http://php.net/uniqid –

Cuestiones relacionadas