Le sql injection sono le iniezioni di codice in una query e possono rappresentare un grave problema per la protezione dei database.
Evitarle è piuttosto semplice, basta prendere i dovuti accorgimenti quando creiamo i nostri script.

Vediamo degli esempi con PHP ma teniamo conto che ogni linguaggio di programmazione permette di implementare tutti i sistemi di sicurezza necessari ad evitare le sql injection.

La funzione mysql_real_escape_string() di PHP aggiunge la sequenza di “escape” ai caratteri speciali (tenendo conto dell’attuale set di caratteri della connessione. Un altro accorgimento da prendere è la costruzione delle query con la definizione giusta di stringhe.
Un esempio:

$sql = 'SELECT * FROM tabella WHERE id = ' . $id;

Questa stringa può causare problemi: mettiamo che $id venga da $_GET e debba essere un numero.
Se manomettiamo il valore in modo tale che $id diventi 1 OR 1 = 1, la query risultante sarà:

SELECT * FROM tabella WHERE id = 1 OR 1 = 1

il che ritorna tutte le righe, aprendo cosi il nostro database al visitatore malintenzionato.

Se pero’ scriviamo la stessa query così:

$sql = 'SELECT * FROM tabella WHERE id = "' . $id . '"';

$id potrà assumere il valore 1 OR 1 = 1 e la query diventa:

SELECT * FROM tabella WHERE id = "1 OR 1 = 1"

In questo caso, dato che abbiamo definito la stringa, la query non produce alcun risultato.

Un altro metodo efficace per evitare l’sql injection è fare controlli molto precisi sulla validità dei valori inseriti dall’utente nei form di modo che sia valido solo lo strettamente necessario. E’ poco controllare che un campo obbligatorio non sia una stringa di zero caratteri: se è un nome accetta solo lettere e spazi, se è un CAP accetta solo 5 numeri, e cosi via.

Nel primo esempio, se sappiamo che $id è un campo di MySQL INT e auto_increment, il suo valore potrà essere solo un valore numerico: un controllo sulla stringa 1 OR 1 = 1 non eseguirà la query perché il risultato del controllo riporterà che non intero.

Sperando che possa essere di aiuto, invito tutti a contattarmi per segnalare ulteriori altri controlli.

Grazie a |andrea|