Si le preocupa que un campo de texto sea objeto de abuso para realizar una inyección de SQL, el saneamiento de entrada no es la solución correcta que debe buscar.
Si el campo de texto era de forma completamente libre, entonces todos los caracteres que podrían usarse para la inyección de SQL serían una entrada válida. Si intenta evitar la inyección de SQL mediante la desinfección de las entradas, termina rechazando las entradas válidas. En otras palabras, es posible que haya evitado la inyección de SQL, pero lo hizo introduciendo un error adicional y no solucionando uno. Desde el punto de vista del usuario, hay al menos tantos casos de entrada válida que no funcionan como antes, tal vez incluso más casos que antes.
La solución adecuada para evitar la inyección de SQL es utilizar expresiones de escape o parametrizadas (que evitan la inyección en una capa de la pila de protocolos al mover la responsabilidad a una capa inferior).
Mientras se escape correctamente en todos los lugares, no hay ninguna razón técnica por la que no sea posible permitir que el campo de nombre de usuario sea un campo de texto de forma libre.
Hay una pregunta diferente sobre qué caracteres permitir en los nombres de usuario. Aunque técnicamente es posible admitir nombres de usuario de forma libre, no es necesariamente una buena idea. Hay argumentos sólidos para limitar el conjunto de caracteres permitidos en los nombres de usuario, pero esos argumentos no tienen nada que ver con la inyección de SQL.
Limitar los nombres de usuario a solo caracteres ASCII es útil si alguna vez necesita comunicarse a través de canales en los que no está seguro acerca de la codificación.
Limitar los nombres de usuario a los caracteres que se encuentran en la misma ubicación en diferentes distribuciones de teclado es útil si está trabajando en un entorno internacional. Pero no impondría tales limitaciones en el software, porque el conjunto de diseños de teclado utilizados por cada usuario difiere.
La prevención de nombres de usuarios que sean visualmente idénticos puede ser una buena idea en sistemas donde es importante poder reconocer un nombre de usuario. Esto significa que no hay caracteres no imprimibles. Y si dos caracteres se ven iguales, solo se permite uno (esto rara vez es un problema si se mantiene solo con caracteres ASCII). Y no se pueden permitir espacios al inicio y al final del nombre de usuario, ni tampoco se pueden permitir dos espacios uno al lado del otro.
Y recuerde que restringir qué nombres de usuario están permitidos no es un sustituto para generar su SQL de forma segura.