Primero, necesitamos saber lo que ya sabe sobre el usuario. Obviamente, tienes un nombre de usuario y una contraseña antigua. ¿Qué más sabes? ¿Tienes dirección de correo electrónico? ¿Tienes datos sobre la flor favorita del usuario?
Suponiendo que tiene un nombre de usuario, una contraseña y una dirección de correo electrónico que funcione, debe agregar dos campos a su tabla de usuario (asumiendo que es una tabla de base de datos): una fecha llamada new_passwd_expire y una cadena new_passwd_id.
Suponiendo que tiene la dirección de correo electrónico del usuario, cuando alguien solicita un restablecimiento de contraseña, actualiza la tabla de usuarios de la siguiente manera:
new_passwd_expire = now() + some number of days
new_passwd_id = some random string of characters (see below)
A continuación, envía un correo electrónico al usuario en esa dirección:
Querido fulano de tal
Alguien ha solicitado una nueva contraseña para la cuenta de usuario <nombre de usuario> en <nombre de su sitio web>. Si solicitó este restablecimiento de contraseña, siga este enlace:
http://example.com/yourscript.lang?update= < new_password_id >
Si ese enlace no funciona, puede ir a http://example.com/yourscript.lang e ingresar lo siguiente en el formulario: <new_password_id>
Si no solicitó un restablecimiento de contraseña, puede ignorar este correo electrónico.
Gracias, yada yada
Ahora, codificando yourscript.lang: este script necesita un formulario. Si la actualización de var pasó a la URL, el formulario solo solicita el nombre de usuario y la dirección de correo electrónico del usuario. Si la actualización no se aprueba, solicita el nombre de usuario, la dirección de correo electrónico y el código de identificación enviado en el correo electrónico. También solicita una nueva contraseña (dos veces, por supuesto).
Para verificar la nueva contraseña del usuario, verifica que el nombre de usuario, la dirección de correo electrónico y el código de identificación coincidan, que la solicitud no haya expirado y que las dos nuevas contraseñas coincidan. Si tiene éxito, cambie la contraseña del usuario a la nueva contraseña y borre los campos de restablecimiento de contraseña de la tabla de usuarios. También asegúrese de cerrar la sesión del usuario / borrar las cookies relacionadas con el inicio de sesión y redirigir al usuario a la página de inicio de sesión.
Básicamente, el campo new_passwd_id es una contraseña que solo funciona en la página de restablecimiento de contraseña.
Una mejora potencial: podría eliminar <nombre de usuario> del correo electrónico. "Alguien ha solicitado un restablecimiento de contraseña para una cuenta en esta dirección de correo electrónico ..." Por lo tanto, el nombre de usuario es algo que solo el usuario sabe si el correo electrónico es interceptado. No comencé de esa manera porque si alguien está atacando la cuenta, ya conoce el nombre de usuario. Esta oscuridad adicional detiene los ataques de oportunidad de intermediarios en caso de que alguien malintencionado intercepte el correo electrónico.
En cuanto a tus preguntas:
Generando la cadena aleatoria: no necesita ser extremadamente aleatorio. Cualquier generador de GUID o incluso md5 (concat (salt, current_timestamp ())) es suficiente, donde salt es algo en el registro del usuario como se creó la cuenta de marca de tiempo. Tiene que ser algo que el usuario no pueda ver.
timer: Sí, lo necesitas solo para mantener tu base de datos sana. No es realmente necesario más de una semana, pero al menos 2 días, ya que nunca se sabe cuánto puede durar un retraso de correo electrónico.
Dirección IP: dado que el correo electrónico puede demorarse días, la dirección IP solo es útil para el registro, no para la validación. Si desea registrarlo, hágalo, de lo contrario no lo necesita.
Pantalla de reinicio: ver arriba.
Espero que lo cubra. Buena suerte.