Recientemente, se realizó una revisión de seguridad externa en un sitio web público que administramos. Señalaron que en la "página de recuperación de contraseña", existen diferentes tiempos de respuesta cuando se proporcionan nombres de usuario existentes y no existentes. Afirman que esto podría facilitar que un atacante pruebe los nombres de usuario existentes. El cambio sugerido para eliminar este vector de ataque, es ejecutar siempre la misma lógica para cada intento de recuperación de contraseña.
En nuestro caso, la lógica de recuperación de contraseña consiste en (aproximadamente) los siguientes pasos:
- Cargar el usuario desde la base de datos.
- Envíe un correo electrónico al usuario con un enlace para restablecer la contraseña.
Si el usuario existe, ambos pasos se llevan a cabo. Si el usuario no existe, solo se ejecuta el paso 1.
En términos de búsquedas en bases de datos, etc., esto se resuelve fácilmente. Pero cuando se trata de interactuar con sistemas externos, en este caso enviar un correo electrónico, es menos trivial.
Supuse que introducir un retraso aleatorio no servirá de mucho, ya que es probable que todavía haya una diferencia detectable en las distribuciones de tiempo de respuesta.
Otra idea es configurar una cuenta de correo electrónico en algún lugar y enviar un correo electrónico allí por cada nombre de usuario que no exista.
¿Cuál sería la mejor práctica en esta situación?