Skip to content
SQL Injection: cos'é, esempi pratici e come difendere il tuo sito

SQL Injection: cos’è, esempi pratici e come difendere il tuo sito da attacchi

10 min.

Tra le minacce più subdole e diffuse nel mondo della cybersecurity c’è la SQL Injection: una tecnica di attacco che sfrutta le vulnerabilità nei sistemi di gestione dei database. Basta una semplice riga di codice malevolo inserita in un form o in una barra di ricerca per compromettere l’intero sito, esfiltrare dati riservati o assumere il controllo amministrativo di un’applicazione.

Questo tipo di attacco è noto da decenni, ma continua a colpire con efficacia sorprendente, soprattutto nei siti mal configurati o costruiti senza criteri minimi di sicurezza. PHP e MySQL, ampiamente utilizzati nel web, sono i principali bersagli.

In questo articolo analizziamo cos’è la SQL Injection, come funziona, esempi pratici, test per individuarla e soprattutto le contromisure per prevenirla.

Che cos'é una SQL Injection e perché è pericolosa

Cos’è una SQL Injection e perché è pericolosa

La SQL Injection (iniezione SQL) è un attacco informatico che mira a manipolare le query SQL inviate da un’applicazione al proprio database. L’obiettivo è quello di modificare il comportamento previsto delle query, sfruttando input dell’utente non filtrati o non sanificati correttamente.

In pratica, l’attaccante inserisce del codice SQL malevolo in campi come form di login, ricerche o URL, sperando che venga eseguito dal server senza controlli. Se il codice riesce a raggiungere il database, l’attaccante può:

  • leggere informazioni riservate (email, password, carte di credito),
  • alterare, eliminare o inserire nuovi dati,
  • ottenere accesso amministrativo,
  • compromettere l’intero sistema.

È una tecnica semplice, ma estremamente potente, soprattutto contro siti con scarso livello di protezione. I danni vanno dalla violazione dei dati personali fino alla distruzione completa di un’applicazione web.

Esempio pratico di un attacco SQL Injection

Esempio pratico di attacco SQL Injection

Per capire quanto possa essere pericolosa una SQL Injection, basta osservare un esempio concreto. Immagina un sito con un form di login basato su questa semplice query SQL:

SELECT * FROM utenti WHERE username = 'utente' AND password = 'password';

Se l’applicazione non filtra adeguatamente i dati inseriti dall’utente, un attaccante potrebbe compilare i campi così:

  • Username: ‘OR’1’=’1
  • Password: ‘OR’1’=’1

La query generata sarebbe:

SELECT * FROM utenti WHERE username = '' OR '1'='1' AND password = ''OR '1'='1';

Il risultato? La condizione ‘1’=’1′ è sempre vera. Il database restituirà l’accesso anche senza credenziali valide, concedendo all’attaccante l’accesso non autorizzato. Questo è un tipico caso di bypass dell’autenticazione tramite SQL Injection.

In scenari più avanzati, lo stesso metodo può essere usato per leggere il contenuto delle tabelle, eliminare record o addirittura ottenere l’accesso al server.

Come funziona tecnicamente una SQL Injection

Come funziona tecnicamente una SQL Injection

Una SQL Injection sfrutta un difetto logico nel modo in cui le istruzioni SQL vengono composte dal codice dell’applicazione. Quando i dati forniti dall’utente (input) vengono concatenati direttamente nelle query senza essere validati, si apre una porta d’ingresso per comandi indesiderati.

Il flusso tipico di un attacco è il seguente:

  1. L’applicazione raccoglie un input dall’utente (form, URL, cookie, header).
  2. Costruisce una query SQL dinamicamente, spesso tramite operazioni di concatenazione.
  3. L’input non viene filtrato o sanificato, permettendo all’attaccante di inserire istruzioni SQL valide.
  4. Il database esegue la query modificata, restituendo risultati non previsti o eseguendo comandi pericolosi.

Esistono diverse varianti di SQL Injection:

  • In-band: l’attaccante riceve l’output della query direttamente nella risposta (es. UNION SELECT).
  • Blind: non riceve risposte visibili, ma deduce le informazioni osservando i comportamenti (es. tempi di risposta, redirect).
  • Out-of-band: il server invia dati a un canale esterno controllato dall’attaccante (es. DNS o HTTP callback).

Tutte le varianti hanno in comune un elemento: l’esecuzione di codice arbitrario grazie a un input non controllato.

Vulnerabilità più comuni: login, form e URL

Le vulnerabilità più comuni: login, form e URL

Gli attacchi SQL Injection si verificano in genere nei punti in cui l’applicazione accetta input da parte dell’utente e li usa per costruire query al database. Alcuni dei bersagli più esposti includono:

  • Form di login: come visto nell’esempio precedente, se la query che autentica l’utente è vulnerabile, un attaccante può accedere senza credenziali valide.
  • Campi di ricerca: molti motori di ricerca interni ai siti utilizzano query dinamiche per mostrare risultati. Un parametro malevolo può alterare l’interrogazione SQL.
  • URL con parametri GET: ad esempio ?id=1. Se il parametro non è filtrato, può essere manipolato per leggere o modificare dati di altre voci del database.
  • Cookie e header HTTP: alcuni sviluppatori memorizzano dati nel cookie per richiamare impostazioni utente. Se questi valori vengono inseriti in una query SQL, diventano un potenziale vettore di attacco.
  • Form di registrazione o contatto: dove i campi come “nome”, “email” o “messaggio” finiscono in una query SQL senza filtri adeguati.

La presenza di input dinamici non è un problema in sé. Il vero rischio nasce quando questi input vengono usati senza alcun controllo, permettendo l’iniezione di comandi SQL non previsti.

Test e strumenti per individuare le falle SQL

Test e strumenti per individuare le falle SQL

Individuare una vulnerabilità SQL Injection prima di un attaccante è fondamentale. Esistono diversi approcci, manuali e automatizzati, per testare la sicurezza del proprio sito.

  1. Test manuali
    Una delle tecniche più semplici è inserire caratteri speciali in input sospetti, ad esempio:
  • OR 1=1
  • ‘; DROP TABLE utenti;–

Se la pagina mostra errori SQL, comportamenti anomali o restituisce dati non previsti, è possibile che esista una falla. Tuttavia, questo metodo è impreciso e rischioso se non eseguito correttamente.

  1. Scanner automatici
    Strumenti open source e professionali permettono di analizzare in profondità le applicazioni web:
  • sqlmap: probabilmente il più noto, open source, effettua test approfonditi su form, parametri e cookie.
  • OWASP ZAP: scanner completo per vulnerabilità web, include test per SQLi.
  • Burp Suite: potente suite per penetration test, offre strumenti avanzati per manipolare richieste e intercettare risposte.
  • Acunetix, Netsparker: soluzioni commerciali con interfacce user-friendly e report dettagliati.
  1. Test black box e white box
  • Black box: il tester simula un attacco senza conoscere il codice.
  • White box: si analizza il codice sorgente per identificare punti critici.

Effettuare test periodici è essenziale per scoprire vulnerabilità introdotte da nuove funzionalità o aggiornamenti.

Come proteggere il tuo sito da una SQL Injection

Come proteggere il tuo sito da una SQL Injection

Difendersi da una SQL Injection non richiede magie, ma disciplina nello sviluppo. Le buone pratiche di sicurezza web prevedono che ogni input venga trattato come potenzialmente pericoloso, e quindi filtrato, validato e mai inserito direttamente nelle query.

Ecco i metodi principali per prevenire le iniezioni SQL:

  1. Utilizzare query parametrizzate (prepared statements)
    È la tecnica più efficace. I parametri sono separati dalla query SQL e non possono essere interpretati come codice.

Esempio in PHP con PDO:

$stmt = $pdo->prepare("SELECT * FROM utenti WHERE username = :user AND password = :pass");

$stmt->execute(['user' => $input_user, 'pass' => $input_pass]);

  1. Escapare correttamente gli input
    Se non si usano query parametrizzate, è obbligatorio eseguire un’escapatura rigorosa dei caratteri speciali (es. ‘, –, ;), ma non è la soluzione consigliata: è fragile e soggetta a errori.
  2. Validazione lato server
    Tutti gli input devono essere controllati: lunghezza, formato, caratteri ammessi. Non affidarsi mai solo alla validazione lato client.
  3. Limitare i privilegi del database
    L’utente con cui l’applicazione accede al database non dovrebbe avere privilegi superiori a quelli strettamente necessari. Evitare account con permessi di DROP, DELETE o GRANT.
  4. Error handling sicuro
    I messaggi di errore dettagliati devono essere disattivati in produzione. Non fornire mai feedback tecnico all’utente.
  5. Aggiornamenti e patching
    Tenere sempre aggiornati CMS, plugin, framework e librerie: molte falle SQL derivano da componenti di terze parti non aggiornati.

Tecnologie e best practice contro gli attacchi

Tecnologie e best practice contro gli attacchi

Oltre al corretto sviluppo del codice, esistono strumenti e strategie che aiutano a mitigare il rischio di SQL Injection anche a livello infrastrutturale. Integrare più livelli di difesa è il modo migliore per prevenire attacchi reali.

  1. Web Application Firewall (WAF)
    Un WAF analizza il traffico HTTP in tempo reale e blocca automaticamente tentativi noti di iniezione SQL. Soluzioni come Cloudflare, AWS WAF o ModSecurity offrono protezione proattiva, anche se non sostituiscono la scrittura sicura del codice.
  2. Logging e monitoraggio attivo
    Registrare le query anomale o gli accessi sospetti consente di intervenire tempestivamente in caso di tentativi di attacco. L’analisi dei log è spesso il primo campanello d’allarme.
  3. Database firewall e query whitelist
    Alcune soluzioni consentono di definire un set di query consentite (whitelist). Tutte le query che non rientrano nello schema predefinito vengono bloccate.
  4. Isolamento e segmentazione
    Separare il database da altri servizi, limitare l’accesso solo agli IP autorizzati e segmentare la rete sono pratiche essenziali in ambienti professionali.
  5. Formazione e consapevolezza
    Molti attacchi avvengono per ignoranza o superficialità nello sviluppo. La formazione del team è il primo strumento di difesa.

L’obiettivo è uno solo: non fidarsi mai degli input. Tutto ciò che proviene dall’esterno va trattato come potenziale vettore di minaccia.

Responsabilità e obblighi in caso di attacco SQL Injection

La SQL Injection è una minaccia ancora attuale, resa pericolosa dalla sua semplicità e da pratiche di sviluppo poco sicure. Proteggere i dati è un obbligo legale e morale: ignorare queste vulnerabilità espone a gravi rischi. Sicurezza applicativa, aggiornamenti, firewall e formazione sono indispensabili per chiunque gestisca un sito. Non è solo una questione tecnica, ma di fiducia, conformità e continuità del progetto digitale.

Vuoi sapere se il tuo sito è vulnerabile a SQL Injection o ad altri attacchi?
Richiedi ora una scansione gratuita e parlane con un esperto di Sito Web Sicuro.

Ultimo aggiornamento:
Condividi con la Community!
Condividi con la Community!
Articoli Correlati

Cos’è un certificato SSL e perché è fondamentale? Un certificato SSL (Secure Sockets Layer) è un protocollo di...

Icona autore dell'articolo
5 min.
Scopri come reagire a un sito web hackerato e proteggere i tuoi dati online. Guida pratica per una...
Icona autore dell'articolo
5 min.

Il primo passo per proteggere la tua azienda Il Vulnerability Assessment (VA) è una procedura tecnica che consente...

Icona autore dell'articolo
5 min.
Security Checker
Inserisci i tuoi dati e ricevi gratuitamente un report via email con lo stato di sicurezza e i suggerimenti per migliorare il tuo Sito!
Security Checker
Stiamo analizzando il tuo Sito
Scansione completata!
Abbiamo ricevuto i tuoi dati: a breve riceverai via email il report con l’analisi del tuo sito.
 Nel frattempo, puoi esplorare i nostri servizi per rendere la tua presenza online ancora più protetta.
Salta al contenuto