Molto spesso, durante i corsi di ASP.NET, nel mentre parlo di validazione mi vien posta la fatidica domanda. Dove debbo applicare il controllo dell'input ?
Questa apparentemente semplice domanda nasconde un problema molto serio, soprattutto nel mondo delle applicazioni distribuite, ma non solo (ricordo che i danni maggiori arrivano da dipendenti inc...ti !!). Innanzi tutto è bene ricordare che l'informazion fornita da un utente è SEMPRE potenzialmente PERICOLOSA. Possiamo avere problemi di sicurezza volontaria (SQL Injection, Cross-Script Injection, ecc.) ma anche involontaria (integrità del dato, inavvertita cancellazione, ecc.). Quindi è bene controllare sempre ciò che viene inserito.
Il problema è quindi dove ? Basta forse aggiungere qualche buon validatore lato client ? La risposta è NO !! Il validatore lato client NON serve per la sicurezza, ma solo per accertarsi che l'utente (che non vuole fare danni) abbia inserito informazioni corrette, evitando di consumare risorse lato server per banali disattenzioni. Infatti la validazione lato client è fin troppo semplicemente aggirabile. Diviene quindi fondamentale validare lato server (webForm).
La regola quindi è: controlliamo qualsiasi input arrivi dal web (sia essa una WebForm o un WebService) prima di processarlo.
Ma è ancora sufficiente ? La risposta potrebbe essere si e no. Dipende se il codice restrostante (liberie, database, ecc.) sono sotto il nostro completo dominio. Infatti, come suggerito nel libro "Writing secure Code 2", se usiamo una libreria che verrà distribuita a terzi (fuori dal nostro controllo) abbiamo l'onere di validare i dati di input dei metodi e delle proprietà delle nostre classi della libreria.
Lo stesso concetto si applica anche al database, web services, dll pubbliche, ecc. ecc. Per le librerie o il codice privato sotto il nostro completo dominio possiamo farne a meno in quanto ad ogni controllo concumiamo risorse e se possiamo farne a meno è meglio ...