Use HTTPS solo para esto, y luego veremos los detalles de la implementación.
Primero que todo, querrá protegerse contra enumeración de usuarios .
Es decir, no reveles en la página si el usuario existe o no. Esto solo debe ser revelado en el correo electrónico mismo.
En segundo lugar, querrá evitar fuga de remitentes . Asegúrese de que no haya enlaces externos o recursos externos en su enlace de destino. Una forma de mitigar esto es redirigir después de seguir el enlace inicial para que el token ya no esté en la cadena de consulta. Tenga en cuenta que si algo sale mal (por ejemplo, su base de datos está inactiva brevemente), y se muestra una plantilla de error estándar, esto puede hacer que el token se filtre en caso de que contenga alguna referencia externa.
Genere un token con 128 bits de entropía con un CSPRNG. Guarde este lado del servidor con SHA-2 para evitar que las vulnerabilidades de fuga de datos en su tabla de reinicio permitan que un atacante restablezca las contraseñas. Tenga en cuenta que la sal no es necesaria. Vence estos tokens después de un corto tiempo (por ejemplo, unas pocas horas).
Además de proporcionar el token no hash al usuario en el enlace de correo electrónico, permite al usuario navegar a la página manualmente y luego pegar el valor del token. Esto puede evitar que los valores de las cadenas de consulta se registren en el historial del navegador y, de forma predeterminada, en cualquier registro de proxy y servidor.
Opcionalmente, puede querer asegurarse de que el identificador de sesión para la sesión que inició el restablecimiento de la contraseña sea el que siguió a enlace . Esto puede ayudar a proteger una cuenta donde el atacante tiene acceso al correo electrónico del usuario (por ejemplo, configurar una regla de reenvío rápido con acceso limitado a la cuenta de correo electrónico). Sin embargo, todo lo que realmente hace es evitar que un atacante siga de manera oportunista un reinicio solicitado por el usuario: el atacante todavía podría solicitar su propio token de reinicio para la víctima si desea apuntar a su sitio en particular.
Una vez que la contraseña se haya restablecido a una de las opciones del usuario, deberá expirar el token y enviar un correo electrónico al usuario para informarle que esto sucedió en caso de que un atacante haya logrado restablecer su contraseña (sin necesariamente teniendo el control de su cuenta de correo) - defensa en profundidad. También debe rotar el identificador de sesión actual y caducar cualquier otro para esta cuenta de usuario .
Esto niega la necesidad de que el usuario tenga que volver a iniciar sesión, al tiempo que borra las sesiones conducidas por un atacante, aunque a algunos usuarios les gusta que el sitio cierre la sesión para que puedan obtener una confirmación de que su contraseña se ha restablecido. La redirección a la página de inicio de sesión también brinda a algunos administradores de contraseñas la posibilidad de guardar la URL de inicio de sesión y la nueva contraseña, aunque muchos ya detectan la nueva contraseña desde la página de restablecimiento.
También puede considerar otras opciones fuera de banda para el mecanismo de restablecimiento y las notificaciones de cambios. Por ejemplo, por SMS o alertas de teléfono móvil.