OCEWeb.it - Blog informatico

SQL Injection: cos’è, come funziona e come proteggere le applicazioni web

da | Giu 2, 2009 | Internet, Sicurezza, Tips

L'articolo è stato aggiornato 2 settimane fa

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.

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.

acquisti_consigliati

Progettare DatabaseSQL in 7 DaysL'analisi dei big data con Python.Database Design for Mere MortalsDatabase SQL & PHPBasi di dati. Tecnologie, architetture e linguaggi per databaseFundamentals of Database Systems

Condividi questo articolo su: