Sarai in grado di eliminare molti di loro, senza dubbio.
Ma, da un lato, alcune vulnerabilità derivano dalla tua architettura . In un certo senso si potrebbe dire che l'applicazione progettata non è sicura.
Supponiamo che il tuo codice di logout non distrugga correttamente la sessione, ma lo lascia in uno stato che è riconosciuto dalla pagina di accesso come "disconnesso". Apparentemente, tutto funziona bene. Passano tutti i test. C'è un test mancante che avrebbe cancellato - tentando di accedere a una risorsa dopo il logout. Ma manca il test.
Se apri due schede nello stesso browser, potresti scoprire che puoi uscire dalla prima pagina e continuare a navigare attraverso il sito utilizzando al 100% richieste regolari, superando tutte le convalide; ed essendo ufficialmente disconnesso, tutto ciò che fai non viene registrato - tutti i tentativi di registrazione si bloccano in silenzio. Il registro della console del tuo browser si riempie di errori e non ti interessa.
Ed è anche peggio di così. Se provi ad accedere a una risorsa superadmin, il sistema prova a verificare se sei autorizzato o meno e, a causa della circostanza imprevista di te che non ha più un lato server associato a entità utente, questo controllo fallisce . In modo che ora questa sessione abbia accesso superadmin .
Quindi ti rimane un'applicazione in cui input perfettamente legali , provenienti semplicemente da due diverse schede dello stesso browser, finiscono per concederti un accesso amministrativo completo all'applicazione, e qualcuno può bloccarlo < em> involontariamente .
E quando questo è successo, perché è realmente successo , la "soluzione" proposta è stata, avete indovinato, cercando di trovare un modo per impedire l'apertura di due schede nel browser invece di tracciando la fonte del problema . La soluzione "reale" era aggiungere una riga con session_destroy()
nel sorgente. Il "quick patch" si è rivelato essere una settimana di kludgy Javascript da incubo .
Un altro esempio è la debolezza casuale o la divulgazione di informazioni nella tua applicazione, che potrebbe consentire a qualcuno di indovinare come ottenere privilegi ingiustificati. Lo faranno emettendo i comandi legali - il problema sarà che loro sono stati in grado di scoprire questi comandi .
Ad esempio, alcune applicazioni possono fornire un menu con opzioni. Un utente a livello di amministrazione mostrerà dieci voci, un ospite ne mostrerà solo due. I collegamenti ai punti di accesso privilegiati non saranno nel codice HTML. Ma se il livello di privilegio dell'utente non è controllato da quei punti di ingresso , chiunque può accedervi a condizione che conosca o indovini i loro nomi.
Prevedibili errori di reimpostazione della password (ad esempio md5 (loginname + unix_timestamp)) consentiranno a un utente malintenzionato di accedere a qualsiasi account inviando una richiesta di reimpostazione della password a tarda notte e inviando ciecamente una conferma ( o un numero ragionevole di tentativi di forza maggiore). L'utente legittimo lo scoprirà la mattina dopo, e potrebbe essere troppo tardi.
Reimpostando la password prima arriva la conferma, e l'utilizzo di quest'ultimo per concedere l'accesso, comporterà un semplice rifiuto del servizio di tutti gli account.
E, naturalmente, potremmo trovare molti altri esempi a diversi livelli di vulnerabilità (dall'accesso a dati non autorizzati all'interruzione del funzionamento del sito) che funzioneranno ancora anche dopo tutte le possibili disinfezione.
D'altra parte, la corretta sterilizzazione degli input potrebbe rivelarsi impossibile, poiché potrebbe essere necessario elaborare combinazioni di input impossibilmente complesse o non essere in grado di dire facilmente se, ad esempio, l'input COTE D'OR
è una richiesta legittima o un'iniezione SQL tentativo (nel caso questo sì, è ragionevolmente facile).
In alcuni scenari avresti bisogno di un interprete sicuro dell'input per essere in grado di dire se l'input è kosher o meno ... ma se tu avessi un tale interprete, avrebbe più senso usarlo per analizzare i dati di input nel codice di produzione. Questo tipo di "schermatura" vale ancora la pena quando non è possibile modificare il comportamento dell'applicazione e si è costretti a schierare un "front-end" più intelligente come scudo; ma come sviluppatore di app Web per app di tua scelta, questo non è il tuo caso.
Il mio consiglio è di pianificare e testare con cura la tua applicazione e provare a pensare a tutto ciò che potrebbe andare storto e cosa fare quando alla fine andrà male.
Applicare una "Grande Muraglia" di input igienizzati potrebbe farti cullare in un falso senso di sicurezza e, a lungo termine, fare più danni che benefici.
Detto questo, ci sono diverse librerie e framework che aggiungeranno l'igienizzazione dell'input in un secondo momento senza costi, ed è indubbiamente una strada che vale la pena perseguire. Che cos'è not è un "proiettile d'argento" che ti consente di "sbarazzarti di tutte le vulnerabilità".