Elenco brevemente alcune riflessioni utili quando si va a sviluppare una applicazione web. Sarò volutamente sintetico per svincolarmi dalle tecnologie e dai linguaggi. Seguiamo alcuni principi:
Compartimentalizzazione
Bisogna rendere chiare ed evidenti le divisioni tra la varie componenti logiche e strutturali dell'applicazione. Limitare al massimo le superfici di attacco. Ogni componente deve essere svincolabile dalle altre a livello logico e non permettere l'utilizzo errato delle risorse che mette a disposizione.
Livello pei privilegi utente
Applicare il privilegio più basso possibile ad ogni utente. Non permettere a un utente di raggiungere funzionalità che non gli servono. Piuttosto impiegare più tempo a creare gruppi, utenti e profili specifici.
Validazione dell'input utente
Filtrare sempre gli input provenienti dall'utente. Sia negli input evidenti (compilazione di form, querystring) che in quelli meno evidenti ma manipolabili (header Http).
Autenticazione/autorizzazione
Monitorare sempre ciò che accade durante i processi di autenticazione utente e tenere costantemente aggiornate le policy di autorizzazione e le risorse.
Non regalare informazioni
Gestire sempre i messaggi di errore sia che provengano dal web server, dall'application server, dal database o da qualunque altro sistema. Sostituire i messaggi di errore predefiniti con messaggi personalizzati che non diano informazioni "sensibili".
Mantenere i sistemi aggiornati
Aggiornare i sistemi alle ultime release stabili (sia che si tratti di Cms, web server, application server, sistemi operativi, database ecc.) e tenere aggiornato il personale sulle vulnerabilità degli ambienti usati!
Ridurre la "superficie di impatto"
Se in un sistema un componente non serve, eliminalo. Non ha senso aumentare i potenziali vettori di attacco.