El registro de intentos de inicio de sesión fallidos expone las contraseñas

38

Comencé a registrar intentos de inicio de sesión fallidos en mi sitio web con un mensaje como

Failed login attempt by qntmfred

He notado que algunos de estos registros se ven como

Failed login attempt by qntmfredmypassword

Supongo que algunas personas tuvieron un inicio de sesión fallido porque escribieron su nombre de usuario y su contraseña en el campo de nombre de usuario. Las contraseñas se cifran en la base de datos, pero si la base de datos se vio comprometida, estos mensajes de registro podrían ser una forma para que un atacante descubra las contraseñas para cualquier pequeño porcentaje de personas que terminen con un inicio de sesión fallido como este.

¿Hay una mejor manera de manejar esto? ¿Debería preocuparme incluso por esta posibilidad?

Kenwarner
fuente
14
Sí, deberías preocuparte por eso.
FoolishSeth
44
Pregunta interesante ya que cruza UX y seguridad. Como se señala en uno de los enlaces de Michael, puede evitar la mayoría de los casos usando Javascript (del lado del cliente). Deshabilite el botón Iniciar sesión mientras el campo de contraseña está vacío. Los usuarios sin Javascript aún pueden usar la pantalla de inicio de sesión de esa manera, ya que el botón no se desactivará en ese caso.
MSalters

Respuestas:

65

Pruébalo así:

Si el nombre de usuario existe, registre "intento fallido de inicio de sesión por username". De lo contrario, registre "intento fallido de inicio de sesión por IP 123.45.67.89". Eso debería solucionar el problema de que las contraseñas aparezcan en el registro accidentalmente.

Mason Wheeler
fuente
14
También puede buscar una contraseña vacía y fallar con un error apropiado en ese caso.
Mike Weller el
Imprimir el nombre de usuario es el problema que describía el OP. A veces, un inicio de sesión fallido se debe a que el usuario no tiene la tecla [tab] y escribe rápidamente el nombre de usuario y la contraseña en el campo de nombre de usuario y pulsa enter. Su sugerencia no maneja esto.
BZink
77
@BZink: Sí, lo hace. Si el nombre de usuario existe , regístrelo como tal. Si lo que el usuario hace es agregar accidentalmente la contraseña al nombre de usuario, la cadena resultante seguramente no será un nombre de usuario válido.
Mason Wheeler
12

¿Por qué no simplemente verificar si dicho nombre de usuario existe en la base de datos? Esto te dejará con 2 posibles resultados.

  1. El usuario ingresó un nombre de usuario correcto. Entonces puede simplemente registrar lo que registra ahora.

  2. El usuario ingresó su contraseña en el campo de nombre de usuario, por lo tanto, el nombre de usuario no es válido. Simplemente ingrese una entrada de registro que indique que hubo un intento fallido de inicio de sesión por parte de un usuario no identificado.

Y, por supuesto, puede tener un campo adicional para registrar ip, fecha y qué no.

galdikas
fuente
3
¿Por qué no agregar un hash del nombre de usuario a la entrada de registro en el n. ° 2? Esto ocultará la contraseña, pero al mismo tiempo permitirá que alguien que mira los registros determine si el mismo usuario no identificado ha realizado múltiples intentos.
emory
Si no hay un registro que contenga el nombre de usuario, es obvio que se equivocaron, por lo que sigue siendo útil para solucionar problemas.
JeffO
2
@emory, si el usuario escribió por error su contraseña junto con el nombre de usuario, no hay una manera viable de extraer solo la parte del nombre de usuario de la cadena. Y creo que es muy poco probable que alguien que ingrese repetidamente su contraseña para el campo de nombre de usuario. Este es un error "único" que haces. Nos pasa lo mejor de nosotros, pero dudo que haya alguien lo suficientemente estúpido como para seguir haciéndolo sin darse cuenta: D
galdikas
@galdikas No hay necesidad de extraer nada del nombre de usuario. Por ejemplo, soy usuario 'usuario' con contraseña 'contraseña'. Me conecto con 'userpassword' y su función hash asigna 'userpassword' a 17. Los registros dirán "Intento de inicio de sesión fallido por un usuario no identificado 17".
emory
1
@galdikas Probablemente no haya nadie lo suficientemente estúpido o persistente para seguir haciéndolo más de unas pocas veces, pero hay scripts que son lo suficientemente estúpidos y persistentes como para hacerlo miles de veces. ¿No te gustaría saber la diferencia?
emory
1

Consideraciones:

  1. ¿Puedes detectar cuándo ha ocurrido esto, en lugar de que alguien escriba mal su nombre de usuario? El registro de nombres de usuario mal escritos puede ser útil para fines de soporte, es decir, responder a la pregunta "¿por qué no puedo iniciar sesión?" Con la respuesta "Usted ha escrito mal su nombre de usuario, eso debería ser un guión, no un punto" o "Tiene dos puntos iniciales luego espacio en blanco: ¿lo has cortado y pegado? Si tiene una pequeña cantidad de usuarios que pagan un alto valor (es decir, no es otro sitio de redes sociales), entonces probablemente tendrá que proporcionar este tipo de soporte.

  2. ¿Cuál es la acción apropiada si alguien hace esto? Los nombres de usuario pueden ser indicadores de intentos de piratería. El hecho de que el nombre de usuario no aparezca en su lista no significa que no necesite saber de qué se trataba. Sin embargo, si cree que esto es un problema grave y puede detectar de quién es la contraseña, puede solicitar al usuario que cambie su contraseña después de que esto haya ocurrido.

  3. ¿Qué es la práctica de la industria? La práctica de la industria es registrar el campo de nombre de usuario pero no el campo de contraseña. Es poco probable que te despidan por hacer esto.

A menos que tenga consideraciones fuera de lo común, sugeriría seguir la práctica de la industria y registrar el campo de nombre de usuario, independientemente. Considere los cambios forzados de contraseña como sugerencia 2 si cree que esto es inadecuado.

Ben
fuente
1

Solo para estar seguro, el inicio de sesión en mi aplicación actual no almacena los parámetros pasados ​​a los métodos de inicio de sesión o restablecimiento de contraseña. La llamada de registro tiene un parámetro opcional que controla esto, que, cuando se establece en verdadero, reemplaza el objeto de parámetros almacenados con [Redacted]. Claro, así que pierdo algunos datos, pero tengo sus direcciones IP, y prefiero no arriesgarme a obtener algo tan sensible en texto sin formato.

Si realmente desea registrar este tipo de cosas, le sugiero que cuando registre un intento de inicio de sesión, verifique la base de datos de los usuarios con un nombre que coincida con lo que tiene en el campo de nombre de usuario, y solo almacénelo si tiene una coincidencia. De lo contrario, simplemente lo almacena como "usuario desconocido". Puede ser sofisticado, verificando si este valor contiene eso o lo que sea, pero siempre existe el riesgo de que obtenga combinaciones como [Usuario] [Contraseña] y [UserPas] [espada], en cuyo caso puede verificar la IP y deducir que inadvertidamente almacenó el inicio de la contraseña de alguien en claro. Puede extender esto al [Usuario] [Contraseña] y [Contraseña de usuario] [??] poco probable pero posible, en cuyo caso puede ver "inicio de sesión fallido por contraseña de usuario" seguido de "Inicio de sesión exitoso por usuario" y deducir todode la contraseña del usuario. En general, para estar seguro, diría que no registre nombres de usuario a menos que el inicio de sesión sea exitoso.

Editar para agregar:

La mayoría de los argumentos que las personas publican para registrar el nombre de usuario para intentos fallidos de inicio de sesión son, en mi opinión, mejor manejados a través de otros métodos.

Por ejemplo, se dice que cuando un cliente pregunta "¿por qué no puedo iniciar sesión?", Los nombres de usuario registrados le permitirán señalar errores tipográficos. Esto es cierto, pero no vale la pena correr el riesgo de atrapar también contraseñas; Para ello, redirigiría al usuario de nuevo al formulario de inicio de sesión en caso de error, resaltando el campo de nombre de usuario y repoblando con lo que escribieron para que puedan ver por sí mismos.

Otro argumento fue que te permite identificar intentos de piratería; Una serie de fallas contra un nombre de usuario puede ser un intento de forzar una contraseña. Lo haría al tener una columna "BadLogins" en la tabla Usuarios, que se incrementa cada vez que un inicio de sesión falla con un nombre de usuario que coincide con este usuario, y se restablece a cero en un inicio de sesión exitoso, después de decirle al usuario "ha habido x intentos de inicio de sesión fallidos desde su último inicio de sesión "y aconsejarles sobre qué hacer si no creen que los intentos fueron de ellos. Si desea ser realmente minucioso, podría tener otra columna que almacene el último valor de la columna BadLogins incluso después del inicio de sesión exitoso, y / o una columna que almacene el valor más alto de esta columna, y / o una columna que almacena el número total de inicios de sesión fallidos que ha tenido esta cuenta.

anaximandro
fuente