¿Cómo puedo verificar de manera segura si existe un nombre de usuario?

40

Estoy trabajando en la funcionalidad de integración de mi aplicación web y en algún momento le pido a un nuevo usuario que elija un nombre de usuario.

Cuando el usuario llega a este punto, tengo su correo electrónico y un número de teléfono que está validado con un SMS y ha pasado el reCAPTCHA de Google no CAPTCHA.

Necesito verificar si el nombre de usuario que uno elige ya existe y si lo hace, entonces se le pide al usuario que elija otro.

Al navegar por la web, encontré algunas páginas que dicen que la implementación de dicha funcionalidad también proporciona a los atacantes una herramienta para verificar si existe un nombre de usuario.

¿Cuáles son las mejores prácticas para verificar si existe un nombre de usuario?

    
pregunta frenchie 16.05.2016 - 19:30
fuente

10 respuestas

39

Esta fuente dice que es casi imposible evitar la enumeración de usuarios en esta situación y retrasar a un atacante es lo mejor que puedes hacer:

  

Si eres un desarrollador, te estarás preguntando cómo puedes proteger tu sitio contra este tipo de ataque. Bueno, aunque es prácticamente imposible hacer que un servicio de registro de cuenta sea inmune a la enumeración del nombre de usuario, sin embargo, es posible evitar los ataques automáticos de enumeración de nombre de usuario en su contra mediante la implementación de un mecanismo CAPTCHA.

Sin embargo, es posible que me haya perdido algo. También siento curiosidad por saber si alguien más tiene una mejor solución.

    
respondido por el Lukas 16.05.2016 - 19:46
fuente
18

¡La alternativa a permitir que múltiples usuarios tengan el mismo nombre de usuario es mucho peor!

Realmente lo que sucede con ese sistema

  • El usuario solicita una nueva contraseña
  • Ahora tiene que revisar las contraseñas para asegurarse de que no ocurran colisiones
  • El usuario puede usar esto para forzar a otras cuentas

Eso es malo. Por lo tanto, debe evitar que varios usuarios tengan el mismo nombre de usuario. Para ello, haga clic en.

¿Qué sucede si un usuario puede encontrar el nombre de usuario de otro usuario?

Este es el escenario que se te presenta y cómo evitas que alguien lo use maliciosamente. ¿Qué riesgo te abres aquí?

  • Un usuario puede encontrar un nombre de usuario
  • Todavía no da acceso, ya que ahora tienen que adivinar la contraseña

Bien, bien, esto ofrece un poco más de seguridad y aún evita que los usuarios reciban correos electrónicos y otra información confidencial filtrada. Pero ahora quieres intentar mitigar los ataques. ¿Cómo haces eso?

Mitigar los ataques de registro

Hay un par de técnicas que existen para prevenirlo, pero la mejor es, con mucho, la limitación de la tasa y los intentos máximos que se registran por IP.

Límite de velocidad, intentos máximos y registro de IP

Cuando un usuario intenta registrarse, solo puede verificar los nombres de usuario disponibles tan rápido. En realidad, a una persona real le tomará uno o dos segundos escribir un nuevo nombre de usuario. Esto le permite hacer algunas simples comprobaciones y saldos . Sin embargo, esto solo sucede cuando intentan registrarse. Cuando un usuario te ataca y usa un nombre de usuario que no está registrado, todo lo que sucede es que ha registrado ese nombre de usuario. Oh bien. Ahora tienen que comenzar de nuevo el proceso de registro, y aquí es donde puede verificarlo.

  • El usuario intenta registrar muchas cuentas realmente rápido: un bot, deténgalos y elimínelos (límite de velocidad)
  • El usuario intenta MUCHO: atacando con la mano, tíralos (intentos máximos)
  • El usuario regresa: la misma dirección IP muestra un atacante realmente determinado. PROHIBEN SU IP (intentos máximos repetidos)

Ahora que el atacante se ha expuesto y se ha prohibido a un nivel de IP. Usted sabe que algo malo está sucediendo aquí, tiene un registro de nombres de usuario que podrían haber sido revelados, y lo mejor es que no hubo fuga de información personal. ¡Gran trabajo!

Sin embargo, ahora necesita volver y cancelar el registro de todas las cuentas que se crearon para intentar encontrar otras. ¡Menos mal que tienes esos registros!

Las desventajas de los nombres de usuario sin correos electrónicos

Aquí hay un gran defecto que debe tener en cuenta cuando no vincula una cuenta a un correo electrónico: El nombre de usuario se puede registrar previamente y guardar para el rescate . Entonces es extremadamente difícil probar la propiedad del nombre de usuario. Esto le permite a alguien hacer un tipo diferente de ataque contra su sistema en el que solo intentan registrar previamente muchas cuentas de personas y retenerlas en un rescate. Esperamos que tenga un registro de las comprobaciones anteriores para poder intentar capturarlos en el acto.

Alternativas

Mencionó que ya han pasado por el proceso de confirmación de correo electrónico, por lo que otra forma de manejarlo en este momento es vincularlo al correo electrónico. Después del registro, si desean cambiar su correo electrónico tendrán que iniciar sesión y enviar una solicitud con un enlace a su correo electrónico para cambiarlo. Esto se puede hacer con un token sensible al tiempo. Ahora también pueden tener un nombre de usuario para mostrar en el sitio. Las fallas también se mitigan aquí ya que el nombre para mostrar puede superponerse y no hay manera de intentar obtener acceso a otra cuenta con esa información, pero el correo electrónico proporciona una verificación de la verdad (y posiblemente algún tipo de identificador físico como una imagen de perfil)

    
respondido por el Robert Mennell 16.05.2016 - 20:01
fuente
9

Cuando un usuario intenta iniciar sesión, ingresa su nombre de usuario. Al registrarse, se le informa si se toma un nombre de usuario o no. Si encuentra un nombre de usuario tomado, puede intentar iniciar sesión con él y posiblemente piratearlo.

Solución que también es otro problema:
Si tuvieron que iniciar sesión con un correo electrónico, el conocimiento de si se toma un nombre de usuario no será útil. Usted inicia sesión con un correo electrónico, no con un nombre de usuario, por lo que no puede saber qué ingresar en el formulario de texto del correo electrónico cuando sabe que hay El nombre de usuario helloman . Pero ahora el problema es decirle al usuario si se toma el correo electrónico.

Solución: cuando se registre, no les diga si el correo electrónico fue recibido, pero dígales que se envió un correo electrónico de confirmación. Envíeles un correo electrónico, si el correo electrónico se registró antes de enviar un correo electrónico que indique que alguien intentó registrar su correo electrónico. Si el que intentó registrar helloman@example.com no es el verdadero infierno, probablemente no verá la bandeja de entrada de correo electrónico de helloman. Y si el verdadero infierno trató de crear una nueva cuenta con su correo electrónico ya registrado, solo él recibirá un correo electrónico que le informará que ya se ha registrado. A menos que haya un pirata informático que haya logrado piratear a helloman, pero muchas personas como helloman no son estúpidas y no usan password como contraseña, también los sistemas de correo electrónico más comunes en la actualidad son muy seguros, por lo que no se preocupe (y si él Los pirateamos, por lo que no es nuestro problema (si configura su propio servidor de correo electrónico para usted y su personal).

    
respondido por el MaxTheBackspace 16.05.2016 - 21:45
fuente
3

Permitir que un usuario (o un atacante) averigüe si los nombres de usuario existen o no se conoce como una vulnerabilidad de "enumeración de nombre de usuario". Esto se resume bien aquí :

  

Como atacante si puedo usar su página de inicio de sesión o contraseña olvidada para   Reducir mi lista de 10000 objetivos a 1000 objetivos, lo haré.

Puedes agregar una "página de registro" a esa lista. Esto ayuda a un atacante en cualquier campaña de suplantación de identidad (phishing) o cualquier ataque de adivinación de contraseña. También es un problema de privacidad si la esposa de Bob, Alice, puede averiguar si bob@example.com existe en Ashley Madison.com.

Básicamente, si está permitiendo que los usuarios escojan su propio nombre de usuario que está separado de su correo electrónico, para protegerse contra la enumeración de usuarios, debe permitir el inicio de sesión solo con correo electrónico / contraseña, y simplemente usar el nombre de usuario como medio de identificación con otros usuarios en el sitio.

De esta manera no hay ninguna vulnerabilidad al decir Lo sentimos, se tomó el nombre de usuario foobar , seleccione otro .

Esto se debe a que, a diferencia de la dirección de correo electrónico, estos nombres de usuario no serán globalmente únicos en el mundo. Por lo tanto, no se viola la privacidad del usuario cuando dice que se ha tomado una. Como complemento, dado que no puede iniciar sesión usando el nombre de usuario directamente, esto no daría lugar a una vulnerabilidad de enumeración de usuarios.

Como beneficio adicional, esto también hace que la recuperación de la cuenta y el registro sean más sencillos (lo que siempre es bueno para la seguridad). Es decir, no es necesario utilizar la función de "nombre de usuario olvidado", así como la "contraseña olvidada", ya que al iniciar sesión con su dirección de correo electrónico, lo que recordarán, eso es lo único que necesitan para recuperar el acceso, siempre que aún tengan acceso a su cuenta de correo electrónico. Sin embargo, asegúrese de evitar la enumeración de usuarios en sus direcciones de correo electrónico: consulte esta respuesta .

Como actualización de esta respuesta, observo que dice que no desea usar el correo electrónico como nombre de usuario en caso de que el usuario decida cambiar su dirección de correo electrónico. La única razón por la que puedo ver esto como un problema si en su arquitectura está utilizando el "nombre de usuario" como clave principal, por lo tanto, cualquier actualización de la dirección de correo electrónico (si fuera un nombre de usuario) causaría la necesidad de que todas las tablas vinculadas estar actualizado. La re-arquitectura de este para usar PK independientes sería la solución preferida para esto en lugar de hacer que el nombre de usuario sea estático. (Noté una gran suposición aquí de mi parte sobre sus razones para esto).

    
respondido por el SilverlightFox 17.05.2016 - 15:20
fuente
1

Hay buenas respuestas de @SilverlightFox y @MaxTheBackspace.

Solo quiero aclarar una cosa otra vez: no debería ser posible de forma predeterminada en ningún punto de la aplicación para que los usuarios puedan enumerar un (probable) identificador único global como una dirección de correo electrónico. Ni una sola vez. No con la supervisión de la dirección IP y la limitación de velocidad y un CAPTCHA en lenguaje Klingon creado con pintura de dedos por un niño pequeño.

No se trata solo de la seguridad de su servicio, sino también de la privacidad del usuario.

    
respondido por el Noir 17.05.2016 - 16:33
fuente
0

Desde una interfaz de usuario / perspectiva de usabilidad, si ya he tomado 3 pasos (correo electrónico, teléfono / recaptcha), eso reduce la probabilidad de un ataque de la máquina, y cualquier obstáculo adicional reducirá la cantidad de personas que desean Regístrate pero abandona la frustración. Personalmente, no me importa en absoluto si trato de elegir MarkyMark (No, no soy el rapero), y si algún otro rapero que quiere ser un bebe ha usado ese nombre, preferiría que el sitio web lo diga para mí, MarkyMark ya está en uso (y, como lo han sugerido otros, también ofrezco la opción de permitirles iniciar sesión como MarkyMark en caso de que haya olvidado que ya me había registrado hace 3 años), y si el sitio me sugiere intente MarkyMark345 o MarkyMarkyMark , eso no necesariamente indica que hay MarkyMark1 thru MarkyMark344 en uso. Agradezco las sugerencias. De hecho, una vez que un sitio sugirió MarkyMark78 y probé MarkyMark77 y fue exitoso.

    
respondido por el Mark Stewart 17.05.2016 - 02:47
fuente
0

Enumerar los nombres de usuario es una amenaza porque la combinación de nombre de usuario y contraseña le dará a un atacante acceso a la cuenta / sistema.

La cantidad de una amenaza que depende de su sistema. Por ejemplo, en un foro donde el nombre de usuario está adjuntado a cada publicación, esa amenaza es muy baja. Si aplica contraseñas seguras, reduce la amenaza.

En tu situación, debido a todos los datos que verificaste antes de que llegara a ese paso, la enumeración sería increíblemente costosa, así que deja de follarte el cerebro y simplemente dile "nombre de usuario tomado", con alternativas que se ofrecen según lo sugerido por Mark Stewart.

    
respondido por el Tom 17.05.2016 - 11:15
fuente
0

Puede ser una mejor práctica para el proceso de inicio de sesión con un correo electrónico y no un nombre de usuario. Si necesita tener un nombre de usuario al no convertirlo en parte de la autenticación, un atacante ya no puede usar la verificación de disponibilidad de nombre de usuario como una herramienta maliciosa. En este punto, el nombre de usuario es solo vanidad e identidad pública.

Sé que en un comentario usted indicó que quería que su usuario pudiera cambiar su correo electrónico, por lo que no quiso usarlo para iniciar sesión. Es una práctica completamente aceptable hacer esto y permitir el cambio de la dirección de correo electrónico. El mismo sitio en el que estás hace esto de la misma manera.

Entonces ahora tiene el problema de verificar si alguien ya se ha registrado con una dirección de correo electrónico. Para empezar, es mucho más difícil para alguien adivinar someguy54@emaildomain.com sobre someguy . Y luego, si el atacante conocía someguy en su servicio y quería atacarlo específicamente, tendría que saber el correo electrónico con el que se registró junto con su contraseña, en oposición a una contraseña.

Pero los ataques automatizados y los ataques manuales persistentes ocurren. Es muy difícil saber si alguien que intentó 50 combinaciones de nombre de usuario está buscando información o simplemente está tratando de encontrar el nombre de usuario perfecto que legítimamente desea usar. Pero si alguien está intentando registrarse con 5 correos electrónicos diferentes, es una señal de alerta mucho más grande para el abuso.

Entonces, al cambiar la autenticación al correo electrónico sobre el nombre de usuario, obtienes:

  • No hay información de autenticación de cara al público
  • Más difícil de adivinar manualmente la información
  • Detección más fácil de abuso

La desventaja es una potencial fuga de privacidad como la mencionada por Lukas en los comentarios . Si alguien quisiera saber si un determinado usuario era miembro y sabía con qué correo electrónico probablemente se registraría, podrían verificarlo con su sistema de registro.

    
respondido por el Bacon Brad 16.05.2016 - 20:30
fuente
0

Esto generalmente no es un problema grave a menos que sus nombres de usuario sean direcciones de correo electrónico, lo que permitiría el spamming o phishing de sus usuarios. (O también potencialmente si proporciona una API de mensajería).

Dicho esto , si cree que el nombre de usuario subyacente debe ser un secreto: permita que los nuevos usuarios elijan un nombre para mostrar , pero no les permita elegir su subyacente a nombre de usuario. En su lugar, ofrezca OAuth o agregue un número o palabra aleatoria a su nombre de visualización para usar al iniciar sesión.

E incluso entonces, si tiene una API de mensajería, la medida de protección más clara es garantizar que los mensajes estén claramente marcados con el nombre de usuario de origen.

    
respondido por el svidgen 19.05.2016 - 00:01
fuente
-4

Bueno, lo primero que tengo que decir es lo que le digo a casi cualquier persona que haga preguntas de nombre de usuario / contraseña: deténgalo . Utilice OpenID y salga del negocio de nombre de usuario / contraseña.

En segundo lugar, los nombres de usuario deben considerarse como una mitigación de colisiones hash, no como seguridad, es decir, dos personas con la misma contraseña. Desde un punto de vista de seguridad, debe considerar el nombre de usuario como uno de los elementos que un atacante ya conoce, no como seguridad adicional.

Por lo tanto, sugeriría permitir el correo electrónico y posiblemente los números de teléfono, así como los nombres de usuario, para identificar una cuenta en la que no puedan o no vayan a usar OpenID (aunque realmente, lo forzaré a usar mi propia configuración interna). proveedor como una segunda aplicación).

Finalmente, cuando tenga que tomar un nombre de usuario, limite la velocidad de los envíos. Tómese un mínimo de dos segundos para devolver la respuesta y duplique el tiempo de cada intento, requiera pasar por todo el proceso nuevamente si abandonan la sesión sin elegir un nombre de usuario.

    
respondido por el jmoreno 17.05.2016 - 17:35
fuente

Lea otras preguntas en las etiquetas