2011-01-04 10 views

Respuesta

7

Usted debe agregar dos campos, y reset_code reset_expiry

Este es el proceso para una funcionalidad de restablecimiento de contraseña segura.

  • El usuario selecciona "Olvidé mi contraseña".

  • Usuario solicitado por correo electrónico/nombre de usuario.

  • Si es válido, genera un GUID y lo almacena en reset_code y también almacena Now() + 24 horas en reset_expiry en la base de datos contra ese usuario en particular.

  • Luego envía un correo electrónico a la dirección de correo electrónico con un enlace para confirmar el restablecimiento de la contraseña. Este correo electrónico contendría un enlace a su sitio web con el nombre de usuario del usuario Y reset_code embedded. (Esto evita que un usuario malintencionado restablezca la contraseña de un tercero simplemente conociendo su correo electrónico)

  • Una vez que el usuario haga clic en el enlace del correo electrónico, se le dirigirá a su sitio web. Su sitio web validará eso: el nombre de usuario y reset_code coinciden, y la hora actual no ha excedido el tiempo reset_expiry.

  • Si todo está bien, podemos completar el restablecimiento de la contraseña. Esto puede hacerse de dos formas:
    a) en pantalla una nueva generada aleatoriamente contraseña
    b) Una nueva contraseña generada de forma aleatoria a través de correo electrónico
    c) La posibilidad de introducir una contraseña de su/su propia elección

+4

Si utiliza una contraseña generada al azar, asegúrese de ajustar la complejidad para que coincida con la capacidad de los usuarios. es decir, no utilice muchos elementos no alfanuméricos, si no es que sus usuarios son expertos en informática. Además, asegúrese de recortar el espacio en blanco de las contraseñas introducidas, ya que es probable que se corten y peguen de los correos electrónicos, que a menudo captan espacios en blanco adicionales. –

+1

Algunas restricciones de caracteres y sustituciones también son buenas ideas: elimine '{0,1,2,3,5, l}' de la lista de caracteres, baje todo y aplique un mapa como '[0,1,2, 3,5, l] -> [o, i, z, b, s, i] 'a la contraseña que le devuelve el usuario. "3" está ahí porque "B" a menudo se confunde con "3" cuando no hay un contexto familiar, los demás deben estar claros. –

7

No debe almacenar las contraseñas de sus usuarios, ni siquiera en forma cifrada. Solo debe almacenar el hash/digest necesario para la autenticación. Entonces, no puede "recuperar" la contraseña (porque no la conoce), simplemente puede restablecerla y/o darle al usuario una contraseña temporal única que le permite establecer una nueva contraseña.

Actualización: si está haciendo lo anterior, el procedimiento estándar es tener un formulario "require-password-reset". El usuario ingresa su identificación (generalmente su correo electrónico) y se genera un "token" (por ejemplo, una cadena aleatoria), se almacena en alguna tabla con fecha de vencimiento y se envía a su correo electrónico junto con un enlace al "restablecimiento de contraseña" formar. De esta forma, se controla el token, el usuario puede ingresar una nueva contraseña y se le indica que intente un nuevo inicio de sesión.

Actualización 2: Puede surgir un pequeño problema de privacidad: ¿Qué debemos hacer si la identificación de usuario (correo electrónico, nombre de usuario o lo que sea) ingresada en el formulario de solicitud no existe en nuestra base de datos? Para enviar un mensaje "El usuario no existe. Verifique la identificación y vuelva a intentarlo". puede estar bien, pero en algunos casos podría causar un problema de privacidad: cualquiera puede verificar si otra persona está registrada en su base de datos. Si desea evitar eso, debe emitir el mismo mensaje ("un correo ha sido enviado con instrucciones ...") incluso si el usuario no fue encontrado (y por lo tanto, no se envió realmente un correo). Problemas de privacidad similares aconsejan simplemente emitir el mensaje "login incorrecto: usuario incorrecto o contraseña" cuando el usuario intenta iniciar sesión sin éxito: no divulgue si se trata de un usuario o contraseña incorrectos.

+0

Pido disculpas, realmente almaceno el hash/digest, por recuperación quise decir reiniciar :) – TheOne

+0

+1. @ Absoluto0: Piense en lo que sucede si alguien roba su base de datos de contraseñas. Si las contraseñas son hash, entonces no hay grandes pérdidas (ya te han subido, pero al menos el atacante no puede usar la base de datos de contraseñas para nada). Sin embargo, si almacena las contraseñas, y si sus usuarios usan la misma contraseña para su sitio que para su correo electrónico (y lo harán), entonces lo culparán cuando su correo electrónico también sea pirateado ... – psmears

+0

@ Absolute0: Cruzado con su comente - me alegra saber que está haciendo lo correcto :) – psmears

0

Estoy de acuerdo con Leonbloy. Almacenar la contraseña lleva a problemas como el incidente de Gawker de hace unas semanas (se descubrieron y publicaron 1,5 millones de combinaciones de ID de usuario/pwd).

Sin embargo, debe tener una función de "restablecimiento de contraseña" que envíe por correo electrónico la nueva contraseña a la dirección de correo electrónico original utilizada para abrir la cuenta.

No debe haber ninguna disposición para cambiar la dirección de correo electrónico durante el restablecimiento de la contraseña. Si el usuario ya no tiene acceso a la cuenta de correo electrónico anterior, es una pena. Abandona la cuenta y comienza de nuevo.

Y use un buen Captcha en la pantalla de reinicio.

Cuestiones relacionadas