Algunas sugerencias:
No restablezca la contraseña del usuario hasta que se confirme. No reinicie inmediatamente la contraseña del usuario. Solo restablézcalo una vez que el usuario haga clic en un enlace de confirmación enviado a su dirección de correo electrónico previamente registrada.
Requerir un CAPTCHA. Cuando un usuario solicita que se restablezca su contraseña, obligue a resolver un CAPTCHA antes de continuar. Esto es para evitar que las herramientas automatizadas intenten causarle dolor a muchos usuarios y obligar al usuario a demostrar que son humanos (no un robot).
Aleatoriedad. La URL de restablecimiento de contraseña por tiempo limitado debe incluir un componente aleatorio e indiscutible. Asegúrate de usar aleatoriedad de calidad criptográfica. La salida de /dev/urandom
o System.Security.Cryptography.RNGCryptoServiceProvider
sería una buena opción. La salida de rand()
o random()
o System.Random
no es lo suficientemente aleatoria y sería una mala elección. Un GUID o marca de tiempo no es lo suficientemente aleatorio y no sería una buena opción.
Incluya un límite de tiempo. El enlace de confirmación de restablecimiento debe expirar después de un tiempo razonable: por ejemplo, 24 horas. El enlace debe ser utilizable solo una vez, y debe expirar inmediatamente tan pronto como se use.
Incluya texto explicativo en el correo electrónico. Es posible que desee agregar un texto explicativo al correo electrónico, para explicar por qué se envió el correo electrónico, en caso de que alguien solicite un restablecimiento de una cuenta que no sea suya. propio. Podría incluir un texto como "Alguien ha solicitado que se restablezca la contraseña de su cuenta username
en site
. Si realizó esta solicitud, haga clic aquí para cambiar su contraseña. Si no la hizo, haga clic aquí para Cancelar la solicitud. "
Enviar correo electrónico una vez que se haya restablecido la contraseña. Una vez que la contraseña se haya restablecido correctamente, envíe un correo electrónico al usuario para informarle que se ha cambiado la contraseña. No incluya la nueva contraseña en ese correo electrónico.
Cancelaciones de monitores. Podría considerar incluir alguna lógica para monitorear la frecuencia con la que los usuarios hacen clic en el enlace de cancelación, lo que indica que no solicitaron un reinicio. Si esto supera un cierto umbral, puede ser útil enviar una alerta a los operadores del sistema. Además, si se visita un enlace de cancelación para alguna solicitud después de , se visita el enlace de confirmación, eso es una posible indicación de un ataque contra ese usuario; es posible que desee tomar medidas en ese punto, por ejemplo, invalidar La contraseña del usuario y le requieren restablecer su contraseña de nuevo. (Esta es una defensa contra el siguiente ataque: el atacante obtiene acceso al buzón del usuario, luego solicita que se restablezca su contraseña en su sitio y luego visite el enlace de confirmación. Si el atacante no elimina estos correos electrónicos de la bandeja de entrada del usuario, luego, cuando el usuario real lee su correo electrónico, puede hacer clic en el enlace de cancelación, lo que le da una indicación de posibles problemas.
Use HTTPS. El enlace debe usar https (no http :), para protegerse contra varios ataques (por ejemplo, ataques de Firesheep a usuarios que navegan por Internet desde un café de Internet).
Registrar estas operaciones. Sugiero registrar todas esas solicitudes. Además de registrar el nombre de usuario del usuario, es posible que desee registrar la dirección IP del cliente que solicitó que se envíe por correo electrónico un enlace de restablecimiento al usuario, así como la dirección IP del cliente que visitó el enlace de restablecimiento.
Lectura adicional. También puede leer la excelente publicación del blog de Troy Hunt, Todo lo que siempre quiso saber sobre la creación de una función de restablecimiento de contraseña segura . Gracias a @coryT por un enlace a este recurso.
Por último, considere la autenticación sin contraseña. Las contraseñas tienen muchos problemas como mecanismo de autenticación, y puede considerar otros métodos de autenticación de usuarios, como el almacenamiento de una cookie segura y persistente en su máquina con un indiscutible Secreto para autenticarlos. De esta manera, no se puede olvidar una contraseña y no se puede falsificar al usuario, aunque sí necesita proporcionar una forma para que el usuario autorice el acceso desde una nueva máquina o un nuevo navegador (posiblemente por correo electrónico a los usuarios que lo soliciten previamente). Dirección de correo electrónico registrado). Este documento de encuesta tiene una excelente encuesta de muchos métodos de autenticación de respaldo y sus fortalezas y debilidades.