Cos'è il SQL injection
Cos'è il SQL injection spiegato semplice e in ottica difensiva: come avviene, perché è pericoloso e come prevenirlo con query parametrizzate e validazione.
Il SQL injection è una delle vulnerabilità web più vecchie e, incredibilmente, ancora tra le più diffuse. È nella OWASP Top 10 da sempre e continua a causare fughe di dati gravi, spesso a causa di errori banali nel modo in cui il codice parla con il database.
In questo articolo ti spiego cos'è il SQL injection in chiave puramente difensiva: come può avvenire, perché è pericoloso e, soprattutto, come prevenirlo. Non troverai payload offensivi, ma le buone pratiche per scrivere codice sicuro.
Cos'è il SQL injection in parole semplici
Il SQL injection è una vulnerabilità che si verifica quando l'input di un utente viene inserito direttamente in una query al database, permettendo di alterare il significato della query stessa. In pratica, dati che dovrebbero essere "solo testo" finiscono per essere interpretati come comandi.
Il problema nasce dalla mancata separazione tra codice (la struttura della query) e dati (i valori forniti dall'utente). Quando questa linea si confonde, il database può eseguire operazioni mai previste dallo sviluppatore.
Perché succede
Immagina un form di login che costruisce la query mettendo insieme stringhe, concatenando direttamente quello che l'utente scrive. Se quel testo viene trattato come parte del comando invece che come semplice valore, la logica della query può cambiare.
La causa quindi non è il database in sé, ma il modo in cui il codice costruisce le query: concatenare input dell'utente dentro le istruzioni SQL è la radice del problema.
Perché è pericoloso
Una vulnerabilità di questo tipo può portare a:
- Accesso non autorizzato a dati riservati.
- Furto di interi database, comprese password e dati personali.
- Modifica o cancellazione di dati.
- Aggiramento dell'autenticazione.
È una delle categorie "Injection" della OWASP Top 10, proprio per la sua gravità e diffusione.
Come prevenirlo (la parte che conta)
La buona notizia è che il SQL injection è quasi del tutto evitabile con poche pratiche solide.
1. Usa query parametrizzate (prepared statement)
È la difesa numero uno. Con le query parametrizzate, i valori forniti dall'utente vengono passati separatamente dalla struttura della query, quindi il database li tratta sempre come dati e mai come comandi. Praticamente tutti i linguaggi e i driver moderni le supportano: usale sempre, anche per query banali.
2. Affidati a un ORM, ma con criterio
Gli ORM (come Prisma, Sequelize, Hibernate) generano query parametrizzate per impostazione predefinita. Sono un'ottima difesa, ma attenzione: se usi query raw o costruisci stringhe a mano, devi comunque parametrizzare.
3. Valida e normalizza l'input
Controlla che i dati abbiano il formato atteso (un'email è un'email, un id è un numero). La validazione non sostituisce le query parametrizzate, ma riduce la superficie d'attacco.
4. Applica il privilegio minimo
L'utente del database usato dall'applicazione dovrebbe avere solo i permessi strettamente necessari. Se non deve cancellare tabelle, non dargli quel permesso: limiti il danno in caso di problemi.
5. Gestisci bene gli errori
Non mostrare mai messaggi di errore del database all'utente: rivelano informazioni preziose. Logga i dettagli internamente e mostra messaggi generici.
Checklist difensiva
- Tutte le query usano parametri, mai concatenazione di stringhe.
- Le query raw dell'ORM sono parametrizzate.
- L'input è validato per tipo e formato.
- L'utente del database ha permessi minimi.
- Gli errori del database non sono esposti all'utente.
- Un WAF aggiunge un ulteriore filtro (vedi cos'è un firewall).
In sintesi
Il SQL injection nasce quando l'input dell'utente viene confuso con il codice di una query. La difesa è netta e semplice: usa sempre query parametrizzate, affidati agli ORM con attenzione, valida gli input e applica il privilegio minimo. Sono pratiche standard che eliminano il problema alla radice.
Se vuoi una revisione di sicurezza del codice del tuo sito per chiudere queste e altre falle, dai un'occhiata ai miei servizi.