|
In questo articolo andiamo ad esaminare una tecnica di hacking ben nota
agli utenti più smaliziati, che prende il nome di SQL Injection. Si
tratta di una tecnica molto efficace e pericolosa, che ogni
programmatore PHP\Mysql (ma anche ASP\Access) dovrebbe conoscere molto
bene, in quanto altrimenti le conseguenze potrebbero essere disastrose.
Partiamo con lo specificare che questo genere di attacchi si basa sull'inefficienza (o magari, addirittura sull'assenza) di opportuni controlli e filtri sull'input dell'utente, il quale potrà inserire del codice malevolo all'interno di una query SQL e di conseguenza ottenere accesso a parti riservate del sito, ad esempio al database stesso (con conseguente possibilità di estrarre, manipolare e cancellare record).
Prendiamo un esempio classico: una pagina di login. Questo il codice del form HTML:
<form method='post' action='login.php'> Nome utente: <input type='text' name='utente' /> Password: <input type='password' name='pass' /> <input type='submit' value='Autenticati' /> </form>
E questo il codice dello script richiamato, login.php:
<?php $query = "SELECT * FROM utenti WHERE nome = $_POST['utente'] AND pass = $_POST['pass']";
$risultato = mysql_query($query);
if(mysql_affected_rows($risultato)>0) // ha trovato almeno un utente corrispondente {
... codice della pagina ... }
?>
Vediamo dunque che se l'utente immente il suo nome utente (test) e la sua password (test123), la query diverrà:
SELECT * FROM utenti WHERE nome = test AND pass = test123
Ma se invece inserisse come utente 'test', ma come password una cosa tipo 'pass_sbagliata OR 1>0', ecco cosa accadrebbe:
SELECT * FROM utenti WHERE nome = test AND pass = test123 OR 1>0
poiché 1>0 è sicuramente vero, e visto che viene specificato dall'operatore OR che basta che sia valida la password o vera la condizione 1>0, il sistema permette il login. Come fare, dunque, per difendersi? Bisogna effettuare dei controlli sull'input! Ovvero, bisogna impedire all'utente di inserire caratteri o parole chiavi pericolose. Usate la funzione addslashes (http://it.php.net/addslashes) per inserire codice html in un database, in modo da effettuare il cosiddetto 'escape' dei caratteri (ad esempio il carattere ' verrà convertito in \'), e controllate sempre che se il campo prevende un input numerico, non vengano inserite lettere o altri caratteri strani.
Simone Frattegiani
|