Cos’è e come possiamo proteggerci dalla SQL Injection, una tecnica di code injection utilizzata da hacker e cracker per violare siti web e portali, che sfrutta uno tra gli errori più diffusi nella programmazione Web.
Già da quando si studiano le tecniche di interazione di un linguaggio di programmazione con un database, infatti, capita spesso di leggere che una determinata precauzione serve ad evitare una SQL Injection: un pericoloso attacco informatico contro le nostre pagine web. Cercheremo di capire in questo articolo su cosa si basa e come proteggersi.
SQL Injection consiste nel passare ad un’applicazione del codice testuale che una volta inserito in un comando SQL causa la violazione di un database. L’attacco può essere svolto in vari modi, per questo, se riesce, può provocare effetti diversi come la distruzione o la modifica di dati, il recupero non autorizzato di informazioni o, più in generale, lo svolgimento di operazioni non consentite.
Supponiamo, ad esempio, che in uno script PHP, sia presente un comando di questo tipo:
$query="SELECT * FROM allievo WHERE id='".$id."'"
Anche per chi non conosce il PHP la sintassi dovrebbe essere comprensibile: si tratta di una query scritta in forma testuale che sarà completata da un valore passato tramite la variabile $id.
Supponiamo ora che un malintenzionato riesca a passare al software un valore in $id uguale alla stringa
"' OR '1'='1"
L’effetto sarebbe la composizione di un testo finale della query di questo tipo:
SELECT * FROM allievo WHERE id='' OR '1'='1'
L’esecuzione di una query simile non solo non causerà errore, ma produrrà la restituzione di tutti i dati presenti nella tabella perché la porzione "OR '1'='1'"
renderà sempre vero il risultato della clausola WHERE.
Cosa avrebbe potuto evitare ciò? Un controllo sui dati inseriti, ad esempio. Se la chiave primaria della tabella è un numero intero, di tale genere dovrebbe essere anche il contenuto della variabile $id pertanto una stringa come quella utilizzata nell’esempio non avrebbe dovuto superare un tale filtro.
Tanto per fare un altro esempio rapido, se si riuscisse a passare all’interno della variabile $id la stringa
"'; DELETE FROM allievo WHERE '1'='1"
sfruttando l’uso del punto e virgola per inoltrare più comandi, si rischierebbe addirittura di permettere la cancellazione dei dati presenti.
Questo sarebbe il risultato della concatenazione delle istruzioni:
SELECT * FROM allievo WHERE id=''; DELETE FROM allievo WHERE '1'='1'
Può sembrare improbabile subire attacchi simili in quanto l’attaccante dovrebbe conoscere la struttura del nostro database, ma ciò non è impossibile sia perché molti progetti sono open source pertanto se ne può conoscere il codice completo, sia perché in alcuni casi rischiamo di esporre dettagli della struttura del database come ad esempio quando facciamo trapelare un messaggio di errore troppo esplicito, che porterebbe il malintenzionato a scovare nomi di tabelle, username e password amministrative, colonne e quant’altro di suo interesse con pochi semplici comandi.
Iscriviti su devACADEMY e SEGUI TUTTI I CORSI che vuoi!
OLTRE 70 CORSI di coding A TUA DISPOSIZIONE con un’unica iscrizione 🙂
Vediamo ora come proteggerci da questa tecnica di hacking/cracking. Contrastare la SQL Injection può richiedere vari accorgimenti:
La SQL Injection è una trappola molto diffusa che ha colpito soprattutto siti web anche se costituisce una minaccia per qualsiasi tipo di applicazione che acceda ai dati via SQL.
Per questo, quando una guida o un corso di programmazione ci invita ad utilizzare qualche meccanismo che impedisca la SQL Injection non prendiamola come una pedante norma accademica, ma ascoltiamola come un consiglio che permette di tutelare al massimo il database della nostra applicazione, cuore del suo valore informativo e della privacy dell’utente.