¿Necesita restringir los caracteres posibles de un nombre de usuario? [cerrado]

-4

Estaba viendo el sistema de inicio de sesión de Twitter y vi este mensaje de error al intentar ingresar un nombre de usuario

  

Su nombre de usuario solo puede contener letras, números y '_'.

Twitter ofrece la posibilidad de iniciar sesión por correo electrónico, teléfono o nombre de usuario. Entonces, cuando complete el formulario de inicio de sesión, puede ingresar {correo electrónico, contraseña} o {nombre de usuario, contraseña}, por ejemplo.

Supongo que este mensaje de error sirve para impedir que un usuario elija una dirección de correo electrónico como nombre de usuario.

¿Sería un problema si el nombre de usuario también fuera una dirección de correo electrónico?

Sugerencia : ¿Qué sucede cuando alguien usa una dirección de correo electrónico que no posee como nombre de usuario y luego el usuario legítimo de este correo electrónico trata de crear una cuenta ...

EDIT : creo que esto va mucho más allá de la simple experiencia del usuario y puede ser objeto de abuso como práctica anticompetitiva por parte de empresas malintencionadas. Ver mi respuesta a continuación para más detalles.

EDIT2 : Aquí hay un ejemplo. Crea una cuenta con la siguiente configuración:

Luego, recibe un mensaje de confirmación solo para [email protected], que es de su propiedad, y efectivamente ha impedido que Bill Gates use su dirección [email protected] para crear una cuenta en el sitio web.

Repita ese proceso miles de veces y evitará que muchos usuarios utilicen su dirección favorita. Los usuarios que decidan no usar su servicio debido a una mala experiencia y la compañía perderían mucho dinero.

    
pregunta Gudradain 09.02.2016 - 20:20
fuente

1 respuesta

2

Hay un poco más de razón para restringir los caracteres de un nombre de usuario que para restringir los caracteres de una contraseña. Esencialmente, el nombre de usuario actúa como un identificador de registro en un sistema de inicio de sesión: debe utilizar la entrada para encontrar el hash de contraseña en su sistema de inicio de sesión. Con las declaraciones de base de datos preparadas, esto no es realmente un problema, pero muchos sistemas no usan declaraciones preparadas, por lo tanto, la gran cantidad de ataques de inyección de SQL que aún son posibles.

Si no está utilizando declaraciones preparadas, tiene dos opciones. Primero, puedes pasar a través de la entrada no modificada. Esta es una mala idea. Considere un nombre de usuario como ' or 1=1 -- . Es válido, en teoría, pero si su sistema de inicio de sesión usa una línea como select * from users where username=$username and password=hash($password) , acaba de hacer un punto de inyección SQL. Esto es más común de lo que cabría esperar.

Alternativamente, puedes desinfectar consistentemente en tu aplicación. Si elige esto, debe asegurarse de que todas las formas posibles de iniciar sesión (sitio web, aplicación móvil, API) utilicen el mismo proceso de desinfección. Podría (y este es un ejemplo malo , no usar en producción). La URL codifica todos los caracteres en el nombre de usuario, por lo que el mismo nombre de usuario se almacenaría como %27+or+1%3D1+-- . Esto es un poco mejor que el anterior, pero puede provocar problemas inesperados si hay algún problema con su proceso de desinfección. Incluso puedes usarlos como hash, pero luego es muy difícil vincular los informes de los usuarios con sus registros.

También tiende a imprimir los nombres de usuario dentro de la aplicación en varios puntos. Si permitiera caracteres, abriría su aplicación a vulnerabilidades de XSS. Esto no se evita a menos que genere la codificación correctamente, pero luego tiene el problema de que lo que se muestra en la aplicación podría no funcionar para iniciar sesión.

En términos de una dirección de correo electrónico como nombre de usuario, en teoría está bien. ¡Pero las direcciones de correo electrónico son perfectamente capaces de incluir casi todos los problemas anteriores también!

    
respondido por el Matthew 09.02.2016 - 20:58
fuente

Lea otras preguntas en las etiquetas