Se sei preoccupato che un campo di testo venga abusato per eseguire l'iniezione SQL, allora l'input dei servizi igienici non è la soluzione corretta da cercare.
Se il campo di testo era completamente libero, allora ogni carattere che poteva essere utilizzato per l'iniezione SQL sarebbe un input valido. Se si tenta di evitare l'iniezione SQL disinfettando gli input, si finisce per rifiutare input validi. In altre parole, potresti aver evitato l'SQL injection, ma l'hai fatto introducendo un bug aggiuntivo non risolvendolo. Dal punto di vista dell'utente, ci sono almeno tanti casi di input validi che non funzionano come prima, forse anche più casi di prima.
La soluzione corretta per evitare l'iniezione SQL consiste nell'utilizzare espressioni di escape o parametrizzate (che evitano l'iniezione su un livello dello stack del protocollo spostando la responsabilità su un livello inferiore).
Se esegui correttamente l'escape in tutte le posizioni, non c'è alcun motivo tecnico per cui non sarebbe possibile lasciare che il campo del nome utente sia un campo di testo libero.
C'è una domanda diversa su quali caratteri autorizzare nei nomi utente. Sebbene sia tecnicamente possibile supportare nomi utente in forma libera, non è necessariamente una buona idea. Esistono validi argomenti per limitare l'insieme di caratteri consentiti nei nomi utente, ma questi argomenti non hanno nulla a che fare con l'iniezione SQL.
Limitare i nomi utente solo ai caratteri ASCII è utile se hanno bisogno di essere comunicati attraverso canali in cui non si è sicuri della codifica.
Limitare i nomi utente ai personaggi che si trovano nella stessa posizione su diversi layout di tastiera è utile se si lavora in un ambiente internazionale. Ma non imporre tali limitazioni nel software, perché la serie di layout di tastiera utilizzata da ciascun utente è diversa.
Prevenire nomi utente visivamente identici può essere una buona idea in sistemi in cui è importante essere in grado di riconoscere un nome utente. Questo significa nessun carattere non stampabile. E se due caratteri sembrano uguali, ne consente uno solo (raramente si tratta di un problema se si utilizzano solo caratteri ASCII). E gli spazi non possono essere permessi all'inizio e alla fine del nome utente, né possono essere consentiti due spazi uno accanto all'altro.
E ricorda che limitare i nomi utente consentiti non è un sostituto per generare SQL in modo sicuro.