OK, así que supongamos que está haciendo todas las tareas de codificación de cadenas correctas. No tiene inyecciones de SQL, inyecciones de HTML ni lugares donde no esté codificando URL algo que debería. Así que no tenemos que preocuparnos de que caracteres como "< &% \ sean mágicos en algunos contextos. Y está usando UTF-8 para todo, así que todo Unicode está en juego. ¿Qué otras razones existen para limitar los nombres de usuario?
para empezar, todos los caracteres de control, a la cordura. no hay ninguna razón para tener caracteres u + 0000 a u + 001F o u + 007F a u + 009F en un nombre de usuario.
a continuación, negar o normalizar inesperada espacios en blanco. Es posible que desee permitir un espacio en un nombre de usuario, pero es casi seguro que no desea permitir espacios iniciales, espacios finales o más de un espacio en una fila. Pueden representar lo mismo en HTML, pero probablemente sean error de usuario que confundirá.
Si tiene la intención de permitir que el nombre de usuario se use para iniciar sesión mediante HTTP Basic Authentication, debe rechazar el carácter :
, porque el esquema de autenticación básica codifica un par de 'nombre de usuario: contraseña' sin escape si hay dos puntos en el nombre de usuario o contraseña.Por lo tanto, al menos uno de los nombres de usuario y la contraseña deben tener los dos puntos excluidos, y es mejor que ese sea el nombre de usuario porque restringir la elección de las contraseñas es mucho peor que los nombres de usuario.
Para la Autenticación básica, es posible que también desee deshabilitar todos los caracteres que no sean ASCII, ya que son manejados de forma diferente por diferentes navegadores. IE los codifica utilizando la página de códigos del sistema; Firefox los codifica usando ISO-8859-1; Opera los codifica usando UTF-8. Los usuarios deben al menos ser advertidos antes de elegir nombres que no sean ASCII si HTTP Auth va a estar disponible, ya que usarlos realmente será poco confiable.
Considere otras secuencias de control Unicode, cosas como las anulaciones bidi y otros caracteres enumerados allí no son aptos para el uso en el marcado. Probablemente termines poniéndolos en el marcado y no quieres que alguien con un RLO en su nombre vuelva una carga del texto en tu página.
Además, si permite que Unicode haga la normalización en las cadenas que obtiene. De lo contrario, alguien puede tener un nombre de usuario con un carácter de diéresis ö
, y preguntarse por qué no pueden iniciar sesión en una Mac, que de forma predeterminada usaría un carácter o
por separado, seguido de la combinación de umlaut. Es normal normalizar el formulario compuesto NFC en la web. Es posible que también desee hacer descomposiciones de compatibilidad utilizando el formulario NFKC; esto permitiría a un usuario Chris iniciar sesión desde un teclado japonés en modo romaji de ancho completo escribiendo Chris. Estos son problemas generales que es bueno resolver para todas las entradas de su webapp, pero para los identificadores como los nombres de usuario puede ser más crítico para hacerlo bien.
Finalmente, asegúrese de que la longitud es correcta para caber en la base de datos sin un truncado silencioso cambiando el nombre, especialmente si está almacenando como bytes UTF-8 que no quiere que sean recortados a mitad de una secuencia de bytes. Los truncamientos de nombre de usuario también pueden ser un problema de seguridad en general.
Si está utilizando nombres de usuario como un medio único de identificación, tiene mucho más de qué preocuparse: el problema ya mencionado de parecidos como Сhris
(con un cirílico Es С
). Hay muchos de estos para que pueda manejarlos razonablemente; restringir a ASCII o tener un medio adicional para identificar a los usuarios. (O no me importa, como SO no; cuando puedo llamarme a mí mismo Chris de todos modos no tengo necesidad de llamarme a mí mismo С
-hris.)
recuerde que también debe preocuparse por las secuencias de comandos y las inyecciones de HTML , no solo inyecciones de SQL. Pero si siempre está codificando el nombre de usuario antes de mostrarlo, como debería ser, entonces eso no es problema. – rmeador