SQL injection, cos’è e come prevenire, Parte II


Nella prima parte di questo articolo abbiamo parlato di cosa sono le query injection e quali trucchi usano gli hacker per poter entrare nel sistema senza avere i dati di accesso, in questa seconda parte vi mostrerò cosa fare per evitare questi problemi.

Per prima cosa è buona norma inserire nella pagina login.php una ulteriore pagina che si occupi della validazione degli errori (come mostrato anche nel mio precedente articolo ‘Inviare i dati di un form per mail’) in cui andare a validare i dati inseriti nel form controllando che i campi non siano vuoti; verificare se i dati immessi rispettino determinati criteri in particolare se ci aspetta un dato di tipo numerico si deve verificare se effettivamente il dato immesso sia di tipo numerico.

E’ possibile usare il type casting che forza una variabile a un determinato tipo, per esempio:

$id = (int) $_POST['id'];
$sql = "SELECT * FROM  utenti WHERE id=$id";

in questo modo si forza la variabile $id ad un valore intero.

Un ulteriore controllo può essere fatto ricorrendo all’uso delle espressioni regolari: Supponiamo, per esempio, che lo username di un utente registrato sia una stringa alfanumerica composta da un minimo di 4 ed un massimo di 12 caratteri. Possiamo filtrare i dati in modo da poter individuare quelli che non rispettano questi vincoli; per questa situazione è possibile utilizzare la funzione preg_match() oppure la funzione ereg(), come mostrato nel seguente esempio:

<?php
if (preg_match("/^[a-z0-9]{4,12}$/i", $login)) {
// $login rispetta il parametro, per cui posso effettuare la query
}
else {
echo "Errore!!" // errore
}

Con l’istruzione pre_match verifico che la variabile $login sia composta da caratteri letterali o numerici e che la sua lunghezza sia compresa tra i 4 e i 12 caratteri.
Se queste tecniche non sono efficaci, un aiuto può essere rappresentato dalla sostituzione di caratteri pericolosi quali ad esempio gli apici singoli e doppi, la virgola, il punto e virgola, etc, con caratteri innocui.

Questi caratteri possono essere eliminati o sostituiti senza problemi, sfruttando una tra le funzioni
str_replace(), preg_replace(), ereg_replace() o strtr(), ad esempio:

$input = str_replace("'", "", $input); // sostituisco l’apice singolo con uno spazio vuoto

Questa tecnica, però, non è molto pratica perché i vari database si comportano differentemente e, pertanto, risulta difficile gestire i diversi casi che si possono presentare.
Una tecnica, invece, molto efficace è quella di effettuare l’escape di alcuni caratteri. Un esempio di funzioni che permettono di fare quanto detto sono le funzioni addslashes() e stripslashes() che vanno ad aggiungere un carattere backspace prima di apici singoli, apici doppi, altri backspace o caratteri NUL. Una applicazione potrebbe essere questa

$_POST['user'] = addslashes($_POST['user']);

in cui se ci sono dei caratteri pericolosi li annullo mediante l’aggiunta dello slash.
Un ulteriore rimedio è quello di ridurre i privilegi sul database: il servizio del server SQL non deve avere privilegi superiori; in questo modo è possibile contrastare le tecniche di hacking che, invece, li richiedono. In ultimo è opportuno che i dati sensibili, come per esempio la password di accesso a un sito, vengano codificati con le opportune istruzioni e, quindi, non sono salvate in chiaro nel database.
In questi 2 articoli vi ho introdotto le query injection spiegando come funzionano e a quali rischi si va incontro. Vi ho mostrato, anche, una serie di tecniche che il programmatore della pagine web dovrebbe adottare per poterle evitare. Quello a cui, dunque, bisogna prestare particolare attenzione sono tutte le variabili di un input, tenendo conto di ogni possibile, oppure improbabile, situazione.

Info sull' autore:
Laureato in matematica con la passione per internet. Ho fatto una esperienza abbastanza interessante in questo ruolo con un assegno di ricerca. Ho avuto modo di approfondire e utilizzare al meglio le potenzialità del linguaggio PHP e dei database MYSQL mirati alla gestione e pubblicazioni di dati ambientali.
Leggi gli altri articoli di

Ancora nessuna risposta per SQL injection, cos’è e come prevenire, Parte II

Lascia un commento

Trackbacks