2010-07-02 28 views
14

Estoy buscando configurar un script de recuperación de contraseña de php, utilizando un token que caduque después de 24 horas, pero no estoy seguro de cómo hacerlo. Tengo contraseñas de usuario cifradas SHA1 en este momento, todo lo que quiero hacer es agregar un token a la URL que se envía al usuario cuando solicita un restablecimiento de contraseña, pero ¿cómo hago esto correctamente y qué hago? necesidad de almacenar en la base de datos?Ayuda de PHP con restablecimiento de contraseña y caducidad del token

Respuesta

3

Debe almacenar un token único y una marca de tiempo de caducidad del token. Cuando los usuarios visitan la URL única, deben validar el token, el nombre de usuario y la marca de tiempo de caducidad del token. Si todo está bien, puede enviar una nueva contraseña o mostrar un formulario donde el usuario puede configurar una nueva contraseña.

+1

Añadiré que cuando el usuario ingresa a la página de 'reinicio', obtiene el token y la fecha de vencimiento de DB y verifica si existe y si aún es válido. Si es demasiado viejo, elimínelo de DB. Si alguno de estos dos, le muestra la página de error. Bueno, esto puede ser obvio :) –

+0

Sí, tienes razón, mi solución es solo un esqueleto así que dibujo: "Si todo está bien" – fabrik

31
  1. Cuando el usuario solicita un restablecimiento de contraseña, generar un token y calcular su fecha de caducidad
  2. tienda el testigo y su fecha de caducidad en columnas separadas en la tabla de usuarios para ese usuario
  3. Enviar un correo electrónico a la de usuario que contiene el enlace de restablecimiento, con el token anexa a su URL
  4. Cuando el usuario pulsa el enlace, coge el testigo de su URL (tal vez con $_GET['token'])
  5. Compruebe la señal a su tabla de usuarios
  6. Comprobar que no es más allá de su fecha de caducidad sin embargo
    • Si se ha vencido, invalidarla, tal vez en la limpieza de los campos, y permitir al usuario volver a enviar
  7. Si el token es válido y usable, presente su formulario de restablecimiento de contraseña para el usuario
  8. Validar y actualizar la contraseña y borrar los campos simbólicos y expiración
+1

Consejo de sonido; sin embargo, es probable que valga la pena señalar aquí que dado que tales tokens son 'equivalentes a contraseña', no se deben almacenar desnudos en la base de datos: sal y hash, tal como se hace con las contraseñas de los usuarios. – eggyal

0

me gustaría ir sobre él mediante la creación de otra base de datos llamada pessword_reset_sessions.

Para que pueda almacenar la siguiente:

ID de usuario generalhash userhash timeinititated intentos

luego con identificador de usuario que isnert el OBV identificación del usuario, con picadillo general es un hash que no se muestra para el usuario pero utilizado para crear el userhash.

iniciada debe ser una marca de tiempo UNIX de la primera vez que solicitó una nueva contraseña.

una vez que confirme que el usuario que solicita la contraseña ha ingresado la información de validación, como correo electrónico, nombre, pregunta secreta. usted crea una fila dentro de la tabla de restablecimiento de contraseña.

y emita un correo electrónico que contenga el userhash.

cuando el hash regresa a través de la $_GET['hash'] a continuación crea un otro hash a partir de la generalhash para comparar con el hash que llegan a través de $ _GET [], si el hash no coincide entonces incrementar el attempts

se también puede verificar antes para asegurarse de que no ha disparado la seguridad durante 2 intentos.

8

No usaría una base de datos en absoluto. Pero una forma de encriptación en su lugar.
Simplemente envíe la información necesaria en el hipervínculo suministrado por correo, firmado por el hash. Algo como esto

$token = sha1($user_id.$time.$user_pass.$salt).dechex(time()).dechex($user_id); 
$link = "http://".$domain."/restorepass/?token=$token"; 

Al recibir sólo divide y decodificar de nuevo, y después comprobar hash y tiempo de espera.

+0

Woow, esto es inteligente :) No voy a usarlo, pero se ve bien :) ¿Realmente lo usas en alguna parte? –

+0

¿Por qué "dechex (time())"? ¿Por qué es mejor que hacerlo? "? Token = $ token & time = $ time & userid = $ user_id"? – boblapointe

+2

Creo que esto no es confiable, porque un atacante podría modificar un token viejo con un nuevo dechex (time()) para reutilizarlo. – alvaropgl

Cuestiones relacionadas