Per la convalida dell'input su un sito web, ci sono problemi di sicurezza nel rivelare all'utente esattamente quali caratteri sono validi o non validi per un dato campo?
CWE-200: Information Exposure dice che si dovrebbe cercare di non divulgare informazioni "che potrebbero essere utili in un attacco ma normalmente non sono disponibili per l'attaccante". Un esempio specifico potrebbe impedire a un sistema di esporre le tracce dello stack (affrontato da CWE-209: Information Exposure Through an Error Message).
È necessario assicurarsi che i messaggi di errore siano vaghi, come "Il testo che hai inserito contiene caratteri non validi"?
È una vulnerabilità di sicurezza includere le espressioni regolari utilizzate per convalidare l'input nel codice lato client, come JavaScript, che sarebbe visibile agli aggressori? L'alternativa, la convalida degli input lato server, ridurrebbe in qualche modo l'usabilità in quanto richiederebbe più comunicazioni di backend (ad esempio, potrebbe far sì che il sito risponda e visualizzi gli errori più lentamente).
Oppure si tratta di una forma di "sicurezza attraverso l'oscurità" in quanto l'utente / aggressore può dedurre quali caratteri sono validi inviando ripetutamente caratteri diversi per vedere se producono errori?
Vale la pena fare i colpi all'esperienza utente per rallentare potenzialmente un attacco?
Dovrei notare, per quanto ne so, il Cheat Sheet di convalida dell'input e Guida allo sviluppo della convalida dei dati non forniscono indicazioni su questo argomento.
Modifica 17-01-2020:
Ci sono state diverse domande (comprese le risposte a cui sono andato allo sforzo di scrivere commenti che da allora sono state cancellato) sul perché si dovrebbe eseguire una convalida dell'input.
Prima di tutto, grazie a @Loek per il commento che punta allo Application Security Verification Standard di OWASP che fornisce una guida sulle password a pagina 21 e 22: "Verifica che non ci siano regole di composizione della password che limitano il tipo di caratteri consentito. Non dovrebbero esserci requisiti per lettere maiuscole o minuscole o numeri o caratteri speciali. ".
Penso che tutti possiamo essere d'accordo sul fatto che limitare i caratteri in una password sia generalmente una cattiva idea (vedi risposta di @ Merchako). Come @emory fa notare, probabilmente non può essere una regola rigida e veloce (ad esempio, ho visto molte app mobili che utilizzano un "PIN" secondario più facile da usare per proteggere l'app anche se qualcun altro ha accesso per accedere al dispositivo.) Non avevo in mente le password quando ho posto questa domanda, ma questa è una direzione in cui sono andati i commenti e le risposte. Quindi, ai fini di questa domanda, consideriamo che sia per campi non password.
La convalida dell'input fa parte della "difesa in profondità" per siti Web, servizi Web e app per prevenire attacchi di iniezione. Gli attacchi di iniezione, come affermato da OWASP, "possono causare la perdita di dati, il danneggiamento o la divulgazione a parti non autorizzate, la perdita di responsabilità o il rifiuto di accesso. L'iniezione a volte può portare alla completa acquisizione dell'host. L'impatto sul business dipende dalle esigenze del applicazione e dati. "
Vedi la vulnerabilità numero 1 di OWASP, A1-Injection e CWE-20: Improper Input Validation per informazioni più dettagliate. Si noti che entrambi affermano che la convalida dell'input non è una difesa completa, ma piuttosto uno strato di quella "difesa in profondità" per i prodotti software.