Home / Blog / -

SQL Injection: cos’è e come proteggersi

di Giuseppe Maggi

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, cos’è e come funziona

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.

VUOI IMPARARE A PROGRAMMARE?

Iscriviti su devACADEMY e SEGUI TUTTI I CORSI che vuoi!
OLTRE 70 CORSI di coding A TUA DISPOSIZIONE con un’unica iscrizione 🙂

SCOPRI I CORSI | ISCRIVITI

SQL Injection, come proteggere il nostro sito o la nostra applicazione

Vediamo ora come proteggerci da questa tecnica di hacking/cracking. Contrastare la SQL Injection può richiedere vari accorgimenti:

  • utilizzo dei Prepared Statement: costrutti con cui viene preparata la struttura di base del comando SQL mentre i parametri da utilizzare saranno inseriti successivamente con l’obbligo di eseguire determinati controlli;
  • verifica del tipo dei dati passati come input per l’applicazione, soprattutto quando devono essere impiegati poi nel comando SQL;
  • restrizione dei permessi sul database: tramite SQL Injection si potrebbe ad esempio fare eseguire con una query anche una cancellazione dei dati. Se l’applicazione ha solo il permesso di leggere dati (qualora non abbia bisogno di modificarli), l’inserimento clandestino di un comando di cancellazione non sarebbe possibile;
  • fornire meno informazioni possibile sulla struttura del nostro database.

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.

» IMPARA A PROGRAMMARE, SCOPRI I NOSTRI CORSI ONLINE «