Come prevenire l'SQL injection

L'imposizione di un accesso con privilegi minimi, la sanificazione degli input degli utenti e la limitazione delle procedure del database possono aiutare a prevenire l'SQL injection e le conseguenti violazioni dei dati.

Obiettivi di apprendimento

Dopo aver letto questo articolo sarai in grado di:

  • Spiegare come funziona l'SQL injection
  • Esaminare le best practice per prevenire l'SQL injection
  • Scoprire come Cloudflare aiuta a prevenire gli attacchi SQLi

Argomenti correlati


Vuoi saperne di più?

Abbonati a theNET, il riepilogo mensile di Cloudflare sulle tematiche più discusse in Internet.

Fai riferimento all'Informativa sulla privacy di Cloudflare per scoprire come raccogliamo ed elaboriamo i tuoi dati personali.

Copia link dell'articolo

Come funzionano gli attacchi di SQL injection

Structured Query Language injection (SQLi) è un attacco di code injection che consente agli autori di attacchi di recuperare, manipolare o distruggere informazioni sensibili situate nei database SQL. Questi attacchi funzionano inserendo comandi specializzati nei campi di query SQL; una volta eseguiti, i comandi possono consentire agli autori di attacchi di falsificare l'identità di utenti legittimi, visualizzare o recuperare dati protetti e persino ottenere l'accesso come root ai server.

Spesso, gli autori di attacchi eseguono SQLi sfruttando le vulnerabilità nelle interfacce di programmazione delle applicazioni (API) che non riescono a distinguere correttamente tra codice legittimo e non attendibile. Senza la capacità di rilevare comandi o query alterati, queste API possono essere utilizzate per eseguire richieste dannose, come aggirare i firewall delle applicazioni Web (WAF) o misure di autenticazione.

In genere, SQLi viene eseguito utilizzando uno dei tre metodi seguenti:

  1. L'SQL injection in banda utilizza un singolo canale di comunicazione per avviare e completare un attacco. I tipi comuni di SQLi in banda includono SQLi basato su errore (quando i messaggi di errore aiutano gli autori di attacchi a identificare informazioni critiche sul database sottostante) e SQLi basato su unione (quando gli aggressori utilizzano gli operatori UNION SQL per scoprire le vulnerabilità nel database). Questa è la forma più semplice e comune di SQLi.
  2. L'SQL injection fuori banda, al contrario, non consente agli autori di attacchi di utilizzare lo stesso canale di comunicazione per avviare e completare un attacco. Invece, l'applicazione compromessa deve essere in grado di esfiltrare i dati verso un endpoint remoto sotto il controllo dell'autore dell'attacco, spesso tramite richiesta DNS o HTTP. Questa è la forma più difficile e meno comune di SQLi.
  3. L'SQL injection inferenziale, chiamata anche blind SQLi, richiede agli autori di attacchi di inviare payload al server preso di mira per imparare a sfruttarlo. Questi di solito assumono una delle due forme: SQLi cieco basato su booleano (quando gli autori di attacchi utilizzano query true-false per costringere un server a produrre risposte diverse) o SQLi cieco basato sul tempo (quando gli aggressori possono dedurre le stesse informazioni tramite variazioni nei tempi di risposta del server). Questo spesso richiede più tempo per essere completato rispetto a un SQLi in banda, ma può essere altrettanto dannoso.

Per vedere esempi reali di query SQL benigne e dannose, consulta Cos'è l'SQL injection?

Sei sotto attacco?
Protezione completa contro gli attacchi informatici

Come prevenire l'SQL injection

Sebbene l'SQL injection sia una delle minacce API più diffuse, può essere efficacemente evitata con le giuste strategie di prevenzione. Approcci utili per prevenire l'SQL injection includono la limitazione delle procedure del database, la sanificazione degli input del database e l'applicazione dell'accesso con privilegi minimi.

Limita le procedure e il codice del database

L'SQL injection dipende in gran parte dalla capacità di un utente malintenzionato di manipolare gli input di dati e le funzioni del database. Limitando questi input e il tipo di procedure di database che possono essere eseguite, le organizzazioni possono ridurre al minimo il rischio di query non autorizzate o dannose. I modi per farlo includono:

  • Applicazione di istruzioni preparate e query con parametri: le istruzioni preparate definiscono il codice SQL accettabile, quindi impostano parametri specifici per le query in arrivo. Qualsiasi istruzione SQL dannosa viene classificata come input di dati non validi, piuttosto che come comandi eseguibili.
  • Utilizzo delle stored procedure: come le istruzioni preparate, le stored procedure sono istruzioni SQL preparate e riutilizzabili che possono essere recuperate da un database e impediscono a soggetti malintenzionati di eseguire codice direttamente sul database stesso.

Convalida e sanifica gli input del database

Gli input degli utenti in qualsiasi database SQL devono essere regolarmente monitorati, convalidati e sanificati per eliminare il codice dannoso. La convalida dell'input garantisce che i dati siano correttamente ispezionati e formattati secondo criteri predeterminati, mentre la sanificazione dell'input modifica (o "sanifica") l'input rimuovendo i caratteri non validi o non sicuri e riformattandolo se necessario. I modi per garantire la convalida degli input includono:

  • Definizione di una lista di autorizzazioni: una lista di autorizzazioni può aiutare a definire input utente validi, rispetto ai quali il database può controllare (e rifiutare) le query in arrivo che appaiono anomale. Ad esempio, i caratteri speciali e gli URL estesi sono due tipi di input utente che possono essere sfruttati dagli autori di attacchi per raccogliere informazioni su un database (prima di eseguire query dannose). Limitare l'uso di questi input può aiutare a ridurre al minimo la probabilità di un attacco.
  • Escape dell'input fornito dall'utente: le organizzazioni possono anche scegliere di eseguire l'escape (ad esempio, trattare come input (e non come comandi o condizioni) tutti gli input forniti dall'utente, in modo che caratteri o parole specifici non possano essere utilizzati per formare richieste dannose.

Applica l'accesso con privilegi minimi

L'accesso con privilegi minimi è il principio di fornire agli utenti solo l'accesso alle risorse protette richiesto dal loro ruolo. Ad esempio, ciò può significare limitare il numero di utenti a cui vengono concessi privilegi a livello di amministratore su un database o persino concedere agli utenti un accesso temporaneo a livello di amministratore che può essere successivamente revocato.

Limitare l'accesso degli utenti a un livello basato sui ruoli aiuta anche a ridurre al minimo l'impatto di una violazione, poiché gli autori di attacchi che violano un database utilizzando credenziali rubate saranno ugualmente limitati nella loro capacità di visualizzare, modificare, rubare o distruggere i dati protetti. Per lo stesso motivo, le organizzazioni dovrebbero limitare l'accesso condiviso ai database su più siti Web e applicazioni.

Come Cloudflare aiuta a prevenire l'SQL injection

Cloudflare aiuta le organizzazioni a migliorare la propria resilienza contro gli attacchi SQLi con un potente portafoglio di sicurezza per applicazioni e API:

  • Cloudflare WAF monitora i modelli di traffico per potenziali exploit SQL, rileva bypass e variazioni nei tipi di attacco e utilizza tecnologie avanzate di machine learning per adattare i set di regole WAF ai metodi di attacco in evoluzione
  • Cloudflare D1 è un database SQL serverless che si integra nativamente con Workers per implementare prepared statements e impedire agli utenti di modificare o eliminare i database.

DOMANDE FREQUENTI

In cosa consiste l'implementazione di query parametriche per prevenire l'SQL injection?

Le query parametriche separano il codice SQL dall'input dell'utente trattando i parametri come valori letterali anziché come codice eseguibile. Questa tecnica aiuta a impedire agli aggressori di iniettare istruzioni SQL dannose.

In che modo il principio del privilegio minimo aiuta a proteggere dall'SQL injection?

Il privilegio minimo limita gli utenti del database solo alle autorizzazioni di cui hanno assolutamente bisogno per le loro funzioni specifiche. Ciò limita i potenziali danni che gli autori di attacchi possono causare. Se gli aggressori eseguono con successo attacchi di SQL injection e ottengono credenziali di accesso legittime, il principio dei privilegi minimi aiuta a contenere i danni che possono causare con un account rubato.

Quale ruolo gioca la convalida dell'input con la creazione di un'allowlist nella prevenzione dell'SQL injection?

L'inserimento in un elenco di elementi consentiti convalida gli input in base a un set specifico di caratteri o modelli accettati anziché limitarsi a cercare contenuti dannosi. Questo approccio consente solo input esplicitamente consentiti anziché cercare di rilevare tutti i possibili schemi di attacco, limitando così la quantità di possibili vettori di attacco.

In che modo le stored procedure possono mitigare le vulnerabilità dell'SQL injection?

Le stored procedure eseguono istruzioni SQL predefinite con parametri passati in modo sicuro al server del database e impediscono ai malintenzionati di eseguire codice direttamente sul database stesso.

Quali sono le strategie efficaci per prevenire gli attacchi di SQL injection di secondo ordine?

I metodi di prevenzione delle iniezioni di secondo ordine includono l'applicazione del principio del privilegio minimo, l'utilizzo di query parametriche e l'implementazione della convalida e della sanificazione degli input.