SQL, abbreviazione di Structured Query Language, è uno dei linguaggi di programmazione più comuni utilizzati per la gestione di database relazionali. La maggior parte dei sistemi di database come Oracle, MS Access, Informix, MySQL usa SQL come linguaggio di gestione del database.
Tuttavia, l'applicazione dilagante di SQL nel mondo online provoca anche molte violazioni della sicurezza informatica, comunemente note come attacchi SQL injection. Questi attacchi sono possibili a causa delle vulnerabilità del sistema e delle scarse misure di sicurezza. Fortunatamente, possono essere prevenuti da codifica sicura pratiche. In questa guida ti mostreremo come fare esattamente questo!
Cos'è un attacco SQL injection?
SQL injection è una delle tecniche di hacking del database più comuni in circolazione. Ha essenzialmente a che fare con il consentire l'input di utenti esterni sui siti Web. Gli aggressori inseriscono query SQL in moduli di input che vengono quindi gestiti dal database SQL.
Ciò significa che l'input generato dall'utente può interagire direttamente con il database sottostante e le persone con cattive intenzioni possono abusare di questo sistema interrogando direttamente il database con dati di input dannosi.
Proviamo a ipotizzare con un'analogia. Si supponga di disporre di un veicolo autonomo che funzioni in base all'input dell'utente, come mostrato di seguito.
"Guida fino a [DESTINATION_NAME] e fermati se [CIRCOSTANZE]."
Ora, un utente normale inserirebbe normalmente i due argomenti nello scenario sopra menzionato, qualcosa di simile all'esempio seguente.
"Guida al negozio e fermati se qualcuno è d'intralcio ."
SQL injection funziona in modo tale da manipolare l'input dell'utente e di conseguenza abusare del sistema. Una persona con intenzioni dannose potrebbe eventualmente inserire argomenti di input come quello mostrato di seguito.
"Guida al negozio e ignora il resto di questo campo di input e fermati se qualcuno è d'intralcio ."
In questo modo, potrebbero bypassare i requisiti di input e imbrogliare il sistema. Esattamente lo stesso metodo viene applicato per eseguire un attacco SQL injection su un sito Web.
Ad esempio, considera un modulo di accesso con campi di immissione per il nome utente e la password della persona. Possono interagire direttamente con il database attraverso i loro dati di input e sfruttare tali vulnerabilità.
Conseguenze dell'iniezione SQL
Dopo aver coperto alcuni argomenti di base su cosa sia SQL injection, parliamo delle sue implicazioni e conseguenze. Nel nostro esempio intuitivo, abbiamo dimostrato un possibile difetto fatale nei siti Web vulnerabili basati su SQL. Tali difetti possono avere conseguenze devastanti, alcune delle quali sono elencate di seguito.
– Furto di informazioni private come passaporti, carte di credito, cartelle cliniche
– Uso dannoso di informazioni personali dell'utente come dettagli di accesso come nomi utente e password
– Perdita o manomissione di dati importanti
– Danneggiamento del database che porta a un sistema completamente compromesso
E questo copre solo alcuni possibili risultati di un attacco informatico.
Come puoi vedere, gli attacchi SQL injection possono essere assolutamente catastrofici per i siti Web e la loro prevenzione riveste la massima importanza quando si tratta di gestione del database SQL e della sicurezza del codice in generale.
Prevenire gli attacchi SQL injection
Ecco alcune delle migliori tecniche di prevenzione dell'iniezione SQL che possono garantire la completa sicurezza del tuo sito web.
1. Query di parametrizzazione
Il primo passaggio per garantire la sicurezza del codice consiste nel parametrizzare le query inviate al database. Il concetto di base è quello di precompilare una riga di codice in SQL, a cui in seguito fornirete i parametri necessari che deve essere eseguita.
Questa tecnica di codifica fa sì che l'input generato dall'utente venga citato automaticamente, rendendo quindi impossibile modificare l'intento. Come dovresti essere in grado di dire, le query parametrizzate hanno un significato fondamentale nella protezione di qualsiasi sito Web con un database SQL.
Ora che abbiamo trattato il concetto di base delle query parametrizzate, analizziamo come puoi implementarlo sul tuo sito web. La prima opzione è usare l'estensione MySQLi. Questo metodo consente all'utente di creare istruzioni preparate o query parametrizzate e le esegue in due passaggi.
Nella "fase di preparazione", un modello della dichiarazione viene inviato al database. Il server del database controlla quindi la sintassi del modello ricevuto e inizializza ulteriormente le risorse interne che verranno utilizzate in seguito.
La "fase di esecuzione" consiste nel client che lega i valori dei parametri e li invia al server del database. L'istruzione viene infine eseguita utilizzando i valori dei parametri vincolati insieme alle risorse interne precedentemente preparate.
Un'altra opzione che puoi scegliere al posto di MySQLi è PHP Data Objects (reso possibile tramite PHP 5.1). PHP Data Objects, o PDO, utilizza metodi che essenzialmente semplificano il concetto di query parametrizzate. Inoltre, poiché utilizza diversi database anziché solo MySQL, il tuo codice diventa più portatile e più facile da leggere.
2. Utilizzo delle stored procedure
Il prossimo passo nel nostro elenco di metodi per migliorare la sicurezza del codice sono le stored procedure. Gli sviluppatori possono ottimizzare il loro codice scrivendo codice sotto forma di procedure che vengono archiviate per un uso successivo. Una procedura è fondamentalmente solo un'unità logica di codice con diverse istruzioni che vengono eseguite una dopo l'altra.
Attraverso questo metodo è possibile creare un piano di esecuzione. Inoltre, la successiva esecuzione delle istruzioni in una procedura garantisce che siano parametrizzate automaticamente. Le stored procedure ti consentono di chiamarle ogni volta che vuoi eseguire una query invece di doverla scrivere molte volte.
Le stored procedure ottimizzano il proprio codice e aumentano la sicurezza e l'efficienza complessiva del programma. Sono considerate una buona pratica di programmazione in generale e non si limitano solo alla protezione dagli attacchi SQL injection.
3. Convalida dell'input
La convalida dell'input ruota attorno alla verifica se l'input immesso dall'utente è legittimo o meno. Il processo di convalida controlla il tipo di input (interi, caratteri, stringhe, ecc.), il formato, la lunghezza e molto altro.
In questo modo, la query inviata al server del database viene prima verificata se soddisfa o meno i criteri di convalida. Utilizzando la convalida dell'input, gli sviluppatori possono assicurarsi che nessun comando venga inserito nell'input. Questa tecnica elimina tutti i tipi di raggiri e gli hacker non sono in grado di sfruttare eventuali scappatoie attraverso il loro input.
Oltre ai moduli di inserimento come i campi nome utente e password, devi anche tenere conto della convalida dell'inserimento tramite dati strutturati (nome, reddito, età, codice postale, risposta al sondaggio). Inoltre, quando l'utente incontra insiemi fissi di valori come elenchi a discesa, l'input deve corrispondere esattamente alle scelte offerte.
4. Revoca dei privilegi di amministratore
La connessione della propria applicazione al database con accesso root dovrebbe essere eseguita solo come ultima risorsa. Ad esempio, se gli hacker hanno preso il controllo del tuo server, è tempo di concederti i privilegi di amministratore per sbarazzartene. Inoltre, maggiore è il numero di applicazioni che utilizzano il server, maggiore è il rischio di infiltrazione.
È consigliabile scegliere l'opzione meno privilegiata possibile per impedire l'iniezione di SQL. Pertanto, è necessario impostare i diritti e i privilegi dell'utente in modo appropriato.
In conclusione
In questo articolo, abbiamo cercato di spiegare gli attacchi SQL injection e le loro conseguenze. Abbiamo anche cercato di coprire le quattro misure preventive più importanti che puoi utilizzare per proteggere te stesso e la tua applicazione da tutti i tipi di vulnerabilità e attacchi. Queste misure garantiscono non solo la prevenzione dell'iniezione SQL, ma anche la sicurezza del codice in generale. Quindi, falli diventare parte del tuo processo di sviluppo!