Prevenire SQL Injection

Il dovere lavorare con dati inseriti da un utente e soprattutto il fatto che questi dati verranno spesso utilizzati
all'interno di query che verranno eseguite sulla base dati, comporta la necessità di dovere prevenire i danni derivabili
da dati inseriti da utenti maliziosi.
Un caso di particolare interesse è l'attacco conosciuto come SQL Injection

Per SQL Injection si intende la possibilità che un visitatore ha, a meno che l'applicazione abbia accorgimenti speciali,
di inviare, ad esempio tramite i campi di una form da cui ci si aspetta tutt'altro, al database server delle query che non
fanno esattamente quello che ci si aspetta.
Vediamo un classico esempio per capire meglio, supponiamo di dovere autenticare tramite una form i nostri utenti:

<form action="login.php" method="POST">
Username: <input name="user">
<br>
Password: <input type="password" name="pwd">
<br>
<input type="submit" value=" Login ">
</form>

la pagina $login.php conterrà al suo interno una query che va a verificare che i dati inseriti corrispondano
effetivamente ad un utente registrato nel nostro sistema:
$query = "SELECT * FROM clienti WHERE username='".$_POST['user']."' AND password='".$_POST['pwd']."'";
Tutto bene fino a che i nostri clienti accedono inserendo quello che ci aspettiamo cioè delle stringhe con il loro utente e
la loro password, ma cosa succede se nel campo user viene inserita la stringa
administrator' OR 1=1 --
e nel campo password
qualsiasicosa
la nostra query diventa
$query = "SELECT * FROM clienti WHERE username='administrator' OR 1=1 --' AND password='qualsiasicosa'";
cioè l'utente verrà riconosciuto come accreditato come 'administrator' qualsiasi sia la password inserita.
Fortunamente il proteggersi da questo tipo di attacco in PHP è relativamente semplice, lapèrima barriera che si può impostare
è sicuramente il verificare che sia attiva la direttiva magic_quotes_gpc (fra l'altro l'impostazione di default lo prevede),
successivamente si può utilizzare odelle funzioni di escape specifiche per il tipo di database che stiamo utlizzando, ad esempio
mysql_escape_string($stringa_di_input) o in definitiva applicare indistintamente la funzione addslashes($stringa_di_input)
a tutti quei dati che andranno a formare le nostre query.
Dato che spesso non si ha accesso diretto al file di configurazione php.ini, rifacendosi all'esempio precedente
può essere utile un costrutto del genere:

if (!get_magic_quotes_gpc())
$_POST['user'] = addslashes($_POST['user']);
$_POST['pwd'] = addslashes($_POST['pwd']);

in questo modo la nostra query attaccata diventerà
$query = "SELECT * FROM clienti WHERE username='administrator\' OR 1=1 --' AND password='qualsiasicosa'";
in questo modo l'apice inserito dall'utente viene interpretato nella query come il carattere apice e non come un terminatore
di una stringa.

Privacy Policy