Un classico ancora attuale
La SQL injection e tra le vulnerabilita piu antiche e ancora oggi tra le piu diffuse. Si verifica quando l'input dell'utente viene concatenato direttamente in una query, permettendo a un attaccante di alterarne la logica e accedere o distruggere dati.
Il codice vulnerabile
Costruire una query incollando stringhe e l'errore fatale. Qui un input come ' OR '1'='1 trasforma la condizione in sempre vera, scavalcando l'autenticazione.
// VULNERABILE: mai fare cosi
const query = `SELECT * FROM utenti WHERE email = '${email}'`;
db.execute(query);
La difesa: query parametrizzate
La soluzione e separare il codice SQL dai dati con query parametrizzate (prepared statement). Il database tratta i parametri come valori, mai come istruzioni, neutralizzando l'iniezione.
// SICURO: parametri separati dalla query
const query = "SELECT * FROM utenti WHERE email = $1";
db.execute(query, [email]);
Difese in profondita
Le query parametrizzate sono la misura principale, ma non l'unica:
- Validare gli input per tipo, lunghezza e formato.
- Minimo privilegio sull'utente del database.
- ORM e query builder affidabili, che parametrizzano per default.
- Messaggi di errore generici, che non rivelino la struttura del database.
In MUSTNODE SRL trattiamo la prevenzione delle injection come un requisito non negoziabile, parametrizzando ogni query e validando ogni input fin dalla progettazione delle applicazioni.
Articoli correlati
Altri approfondimenti dalla categoria Sicurezza.
Sicurezza informatica e auditing: NIS2 in pratica
Cosa richiede la direttiva NIS2 e come tradurla in pratiche concrete di sicurezza, auditing e gestione del rischio per le aziende industriali.
Crittografia applicata: dalle basi a TLS
Chiavi simmetriche e asimmetriche, hash e firme digitali: i fondamenti matematici della crittografia e come proteggono le comunicazioni con TLS.