La SQL Injection è una delle vulnerabilità più gravi e diffuse nel mondo della sicurezza informatica. Colpisce le applicazioni web che si collegano a un database SQL, sfruttando la mancanza di controlli sui dati ricevuti in input. Con questa tecnica, un malintenzionato può inserire comandi malevoli in una query SQL e ottenere accesso non autorizzato a dati sensibili.
In questa guida scopriremo cos’è una SQL Injection, i diversi tipi di attacco, esempi pratici, errori comuni da evitare e le migliori strategie per proteggere siti e applicazioni.

Cos’è una SQL Injection
Una SQL Injection (SQLi) è una tecnica di attacco che consiste nell’inviare comandi SQL arbitrari al database attraverso un input non correttamente validato. Questo avviene quando il codice dell’applicazione inserisce direttamente i dati dell’utente nelle query SQL senza filtrarli o parametrizzarli.
Un attaccante può così:
- Accedere ad aree riservate senza credenziali valide.
- Visualizzare, modificare o cancellare dati.
- Recuperare credenziali dell’amministratore.
- Compromettere l’intero server.
Esempi pratici di SQL Injection
Per capire come funziona una SQLi, vediamo un esempio semplificato di query vulnerabile:
SELECT * FROM utenti WHERE username = '$utente' AND password = '$password';
Se un utente inserisce nei campi del form:
' OR '1'='1
la query diventa:
SELECT * FROM utenti WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';
Il risultato è che la condizione '1'='1'
è sempre vera e l’accesso viene garantito senza conoscere le credenziali.
Nota importante
Questi esempi sono a scopo educativo e non devono essere utilizzati per scopi illegali.
Tipologie di SQL Injection
Non tutte le SQL Injection sono uguali. Possiamo distinguerle in:
- In-band SQL Injection
L’attaccante riceve immediatamente i dati come risposta alla sua query. Include:- Error-based: sfrutta messaggi di errore del database per ottenere informazioni.
- Union-based: usa l’operatore
UNION
per combinare dati da più tabelle.
- Blind SQL Injection
Il sito non mostra errori, ma l’attaccante deduce le informazioni in base al comportamento dell’applicazione:- Boolean-based: si basa su risposte vere o false.
- Time-based: usa comandi che rallentano la risposta del server.
- Out-of-band SQL Injection
Utilizza canali secondari (es. richieste DNS) per esfiltrare dati.
Errori comuni che aprono la porta alla SQL Injection
- Concatenare stringhe direttamente nelle query.
- Mancare la validazione lato server (il JavaScript lato client non basta).
- Usare account del database con privilegi troppo ampi.
- Non gestire correttamente i messaggi di errore (fornendo troppe informazioni).
Come proteggere le pagine ASP dagli attacchi
Con SQL Server: Stored Procedure
Utilizzare Stored Procedure per evitare che i parametri vengano interpretati come comandi SQL.
Funzione di protezione in ASP
<%
Function ProteggiSQL(stringa)
stringa = Replace(stringa, "[", "[[]");
stringa = Replace(stringa, "]", "[]]");
stringa = Replace(stringa, "_", "[_]");
stringa = Replace(stringa, "'", "''");
stringa = Replace(stringa, "%", "[%]");
stringa = Replace(stringa, "#", "[#]");
ProteggiSQL = stringa
End function
SQL = "SELECT * FROM tab1 WHERE ID = '" & ProteggiSQL(Request("ID")) & "'"
%>
Protezione aggiuntiva con HtmlEncode
Per evitare anche attacchi di code injection è possibile usare Server.HtmlEncode:
strHTML = "alert(document.cookie);"
Response.Write(Server.HtmlEncode(strHTML))
In questo modo il browser non interpreterà il codice come JavaScript, ma lo visualizzerà come testo.
Come proteggere le pagine PHP dagli attacchi SQL Injection
Anche in PHP esistono diversi metodi per prevenire le SQL Injection. Due esempi comuni:
Esempio 1 – Filtrare tag HTML e caratteri pericolosi
<?php
function stop($data){
$hash = addslashes(strip_tags($data));
return $hash;
}
?>
Esempio 2 – Usare mysql_real_escape_string (o meglio PDO/MySQLi)
<?php
function stop($data){
$hash = msyql_real_escape_string(strip_tags($data));
return $hash;
}
?>
Entrambe le funzioni bloccano tag HTML sospetti e caratteri speciali come apici singoli e doppi. Tuttavia, il metodo con mysql_real_escape_string
è più sicuro.
Nota: Usa solo una delle due funzioni, non entrambe insieme.
Per maggiore sicurezza è consigliato passare a PDO con prepared statements.
Metodi moderni di protezione
- Prepared Statements / Query Parametrizzate
- ORM (Object Relational Mapping) come Doctrine o Eloquent
- Validazione con whitelist per consentire solo valori previsti
- Web Application Firewall (WAF) per bloccare tentativi sospetti
Impatto legale e GDPR
Una SQL Injection può portare alla violazione di dati personali. In Europa, ciò comporta sanzioni severe secondo il GDPR, oltre a danni d’immagine e perdita di fiducia da parte degli utenti.
Strumenti per verificare se un sito è vulnerabile
- Per SQL Server: UrlScan Filter di Microsoft
- Per tutti: sqlmap, Burp Suite, OWASP ZAP
- Riferimenti: Lista di tool open source NIST
- OWASP Top 10: elenco aggiornato delle vulnerabilità più critiche
Per una sicurezza stabile nel tempo, ricordate di:
- Aggiornare framework e librerie del vostro applicativo
- Limitare i privilegi degli account DB
- Loggare tentativi di accesso sospetti
- Effettuare audit periodici del codice
La SQL Injection è un rischio serio per qualsiasi applicazione web che usa un database SQL. Implementare validazione sicura dei dati, query parametrizzate e controlli costanti è fondamentale per prevenire attacchi e proteggere utenti e informazioni sensibili.
