SQL Injection: cos’è e come fare a difendersi

SQL Injection: cos’è e come fare a difendersi

La SQL Injection è una delle tecniche di attacco più longeve del web, eppure continua a comparire stabilmente nelle classifiche delle vulnerabilità più diffuse e più sfruttate. Il motivo è semplice: quasi ogni sito dinamico, dal piccolo blog all’e-commerce con migliaia di prodotti, si appoggia a un database relazionale per conservare contenuti, credenziali e dati dei clienti. Ogni volta che un’applicazione costruisce una query a partire da un dato inserito da un visitatore, si apre una porta potenziale.

Il rischio riguarda tanto i grandi portali quanto i siti di dimensioni contenute, spesso proprio perché su questi ultimi la manutenzione è meno frequente.

Che cos’è una SQL Injection

La SQL Injection, spesso abbreviata in SQLi, è una tecnica che consiste nell’inserire codice SQL malevolo all’interno dei campi di input di un’applicazione web, con l’obiettivo di alterare le query che vengono eseguite sul database di backend. L’attaccante sfrutta il fatto che l’applicazione tratta l’input dell’utente come parte integrante dell’istruzione da eseguire, invece di considerarlo un semplice valore.

Il risultato è la possibilità di accedere a informazioni che non dovrebbero essere visibili: elenchi di utenti, dati anagrafici dei clienti, password, informazioni commerciali riservate. Nei casi più gravi l’attaccante riesce a modificare o cancellare intere tabelle, oppure a ottenere privilegi amministrativi sul database.

Tecnicamente la vulnerabilità può colpire qualsiasi sistema che dialoghi con un database SQL, inclusi software gestionali e dispositivi di rete. I siti web restano comunque il bersaglio più frequente, perché espongono al pubblico un numero elevato di punti di ingresso: form di ricerca, moduli di login, filtri di catalogo, parametri passati tramite URL.

Come funzionano le query SQL

Per capire la meccanica dell’attacco è utile richiamare il funzionamento di una query. SQL è il linguaggio standard con cui si interrogano e si manipolano i database relazionali: attraverso istruzioni come SELECT, INSERT, UPDATE e DELETE l’applicazione recupera, aggiorna o rimuove i record richiesti.

Una query tipica di un negozio online potrebbe presentarsi in questa forma:

SELECT NomeArticolo, DescrizioneArticolo 

FROM Articoli 

WHERE IDArticolo = 999

Quando un visitatore apre l’indirizzo https://esempio.it/articoli.asp?idarticolo=999, il valore viene inserito nella query e il database restituisce nome e descrizione del prodotto. Il meccanismo funziona correttamente finché l’input contiene ciò che ci si aspetta.

Il problema nasce quando il parametro contiene istruzioni SQL. Modificando l’URL in https://esempio.it/articoli.asp?idarticolo=999 OR 1=1, la query diventa:

SELECT NomeArticolo, DescrizioneArticolo 

FROM Articoli 

WHERE IDArticolo = 999 OR 1=1

Poiché la condizione 1=1 è sempre vera, il database restituisce l’intero contenuto della tabella, inclusi record che l’utente non avrebbe alcun diritto di consultare.

Le varianti sono numerose. Un punto e virgola permette di concatenare una seconda istruzione, con conseguenze molto più serie: un parametro come 999; DROP TABLE Utenti produce una query che elimina l’intera tabella degli utenti. L’operatore UNION consente invece di fondere due SELECT distinte, estraendo dati da tabelle diverse da quella interrogata originariamente; un input costruito come 999 UNION SELECT username, password FROM Utenti restituisce insieme ai dati del prodotto anche le credenziali di ogni account registrato.

Perché le SQL Injection sono così pericolose per un sito web

L’impatto di un attacco riuscito si estende ben oltre il perimetro tecnico. Le conseguenze più frequenti riguardano:

  • la sottrazione di dati personali di clienti e utenti, con obblighi di notifica al Garante privacy e possibili sanzioni ai sensi del GDPR;
  • la compromissione delle credenziali amministrative, che apre la strada a defacement, installazione di malware e reindirizzamenti verso siti fraudolenti;
  • la cancellazione o l’alterazione di record critici, con blocchi operativi e costi di ripristino elevati;
  • la perdita di fiducia da parte dei clienti, particolarmente grave quando vengono esposti numeri di telefono, indirizzi o dati di pagamento;
  • il posizionamento organico compromesso, dal momento che i motori di ricerca penalizzano rapidamente i siti segnalati come compromessi.

Va aggiunto un elemento spesso sottovalutato: la SQL Injection funziona anche come porta di ingresso verso sistemi più profondi. L’attacco subito da Accellion nel 2021, che colpì a cascata banche centrali, enti pubblici e grandi aziende di telecomunicazioni, iniziò proprio con una SQL Injection utilizzata per recuperare le chiavi di cifratura dal database, per poi proseguire con l’esecuzione di comandi a livello di sistema operativo e l’installazione di una web shell dedicata all’esfiltrazione dei dati.

I tipi di SQL Injection

Le tecniche di iniezione vengono classificate in base al canale usato per ricevere i risultati e al livello di visibilità che l’attaccante ottiene.

  • In-band SQL Injection
    Rappresenta la categoria più diffusa, perché l’attaccante utilizza lo stesso canale di comunicazione sia per lanciare l’attacco che per raccoglierne i risultati. Si divide in due sottotipi. Nell’error-based, l’aggressore provoca deliberatamente errori del database e ricava dalle relative segnalazioni informazioni sulla struttura delle tabelle. Nell’union-based, sfrutta l’operatore UNION per unire più istruzioni SELECT e ottenere in una singola risposta HTTP dati provenienti da tabelle differenti.
  • Inferential SQL Injection
    Conosciuta anche come blind SQL Injection, si basa sull’osservazione del comportamento del server. I dati non transitano dal database verso l’attaccante, che deduce le informazioni interpretando le risposte dell’applicazione. Nella variante booleana viene inviata una query il cui esito, vero o falso, modifica il contenuto della risposta HTTP. Nella variante time-based, invece, la query impone al database un ritardo di alcuni secondi: il tempo di risposta rivela l’esito dell’interrogazione. Questa tecnica richiede tempi di esecuzione più lunghi, con un potenziale di danno equivalente a quello delle altre.
  • Out-of-band SQL Injection
    Viene impiegata quando il canale usato per l’attacco risulta inutilizzabile per la raccolta dei risultati, oppure quando il server risponde in modo troppo lento o instabile. La tecnica sfrutta la capacità del server di generare richieste DNS o HTTP verso un sistema controllato dall’attaccante, al quale i dati vengono così recapitati. La sua applicabilità dipende dalle funzionalità abilitate sul database server, il che la rende meno comune delle precedenti.

Come difendersi dalle SQL Injection

La protezione efficace nasce dalla combinazione di più livelli di difesa, applicati sia al codice sia all’infrastruttura.

  • Query parametrizzate e prepared statement
    Costituiscono la contromisura più solida. Con i prepared statement la struttura della query viene definita in anticipo e i valori forniti dall’utente vengono trasmessi separatamente come parametri: il database li interpreta sempre come dati, mai come istruzioni eseguibili. Tutti i principali linguaggi server-side offrono strumenti nativi per farlo, da PDO e MySQLi in PHP fino ai driver equivalenti in Python, Java e Node.js.
  • Validazione e sanificazione degli input
    Ogni dato in ingresso va verificato rispetto al formato atteso, per tipo, lunghezza e insieme di caratteri ammessi. Un campo destinato a un identificativo numerico deve accettare soltanto cifre, un indirizzo e-mail deve rispettare la sintassi prevista. L’approccio più efficace prevede liste di valori consentiti anziché elenchi di elementi vietati, che risultano quasi sempre incompleti.
  • Principio del privilegio minimo
    L’utente con cui l’applicazione si connette al database deve disporre soltanto dei permessi strettamente necessari al proprio funzionamento. Concedere privilegi amministrativi a un account destinato alla semplice lettura di un catalogo amplifica enormemente i danni di un’eventuale compromissione.
  • Gestione controllata dei messaggi di errore
    Le segnalazioni dettagliate del database vanno registrate nei log del server e mai mostrate al visitatore. Un messaggio che rivela nomi di tabelle, colonne o versioni del DBMS fornisce all’attaccante una mappa precisa della struttura da colpire.
  • Web Application Firewall
    Un WAF filtra il traffico HTTP prima che raggiunga l’applicazione, riconoscendo le firme note degli attacchi di iniezione e bloccando le richieste sospette. Rappresenta un livello di protezione prezioso soprattutto per il codice legacy, che difficilmente può essere riscritto in tempi brevi, e per la copertura delle vulnerabilità zero-day nell’intervallo che precede il rilascio di una patch
  • Aggiornamenti costanti
    CMS, plugin, temi, framework e driver di connessione vanno mantenuti sempre aggiornati. Una quota consistente delle SQL Injection andate a segno sfrutta vulnerabilità già note e già corrette, rimaste attive per la mancata applicazione degli aggiornamenti disponibili.

SQL Injection: cos’è e come fare a difendersi

Il ruolo dell’hosting nella sicurezza del tuo sito

Il codice dell’applicazione rappresenta soltanto una parte dell’equazione. L’ambiente su cui il sito viene eseguito determina la rapidità con cui un attacco viene intercettato e la facilità con cui si torna operativi dopo un incidente.

Un hosting orientato alla sicurezza mette a disposizione versioni aggiornate di PHP e dei database server più diffusi, isolamento tra gli account presenti sulla stessa macchina, firewall perimetrale, monitoraggio del traffico anomalo e certificati SSL configurati correttamente. Altrettanto rilevante è la politica di backup: disporre di copie automatiche, frequenti e conservate su sistemi separati consente di ripristinare un database manomesso in tempi ridotti, contenendo il danno economico e reputazionale.

Vhosting affianca alle proprie soluzioni di hosting un’infrastruttura progettata su questi principi, con aggiornamenti gestiti, backup automatizzati e supporto tecnico specializzato. La combinazione tra sviluppo attento e infrastruttura affidabile resta la strategia più efficace per mantenere il proprio progetto online al riparo dalle SQL Injection e dalle minacce che ne derivano.