Le SQL injections rappresentano la tipologia di attacco che si verifica più frequentemente contro le basi di dati accessibili via Web. Esse consistono nella possibilità di effetture richieste 'inaspettate' al DBMS, generalmente tramite form, utilizzando caratteri speciali come ', %, * o #.
Immaginiamo di avere un form per l'autenticazione simile al seguente:
<form method="post" action="login.php">
User : <input type="text" name="usr"><br />
Password : <input type="password" name="pwd"><br />
<input type="submit" value="Invia">
La SELECT destinata all'autenticazione dell'utente potrebbe essere simile alla seguente:
$sql = "SELECT * FROM tb WHERE
usr = '".$_POST['usr']. "' AND pwd = '".$_POST['pwd']."'";
Ora, qualche malintenzionato potrebbe venire a conoscenza del fatto che la user dell'utente che ha l'accesso sia "staff", "root" o "admin"; in questo caso egli potrebbe scavalcare l'esigenza di conoscere la parola chiave associata all'utente con un semplice espediente:
$sql = "SELECT * FROM tb WHERE usr = 'staff'#' AND pwd = 'blah'";
Il carattere speciale # viene interpretato come un'istruzione che dice "ignora tutto quello che si trova dopo questo carattere", il cancelletto è infatti notoriamente utilizzato per i commenti, la password quindi non gli sarà più necessaria!
Per fortuna difendersi dalle SQL injections non è poi molto difficile, PHP mette a disposizione numerose funzioni che possona aiutarci contro gli attacchi alle nostre basi di dati. Si osservi per esempio il seguente listato:
<?
$usr = trim(htmlspecialchars(addslashes($_SESSION['usr'])));
$pwd = trim(htmlspecialchars(addslashes($_SESSION['pwd'])));
$sql = "INSERT INTO tb VALUES (md5($usr), md5($pwd))";
?>
La funzione trim() elimina gli spazi ed altri caratteri all'inizio e alla fine di una stringa; htmlspecialchars() permette di convertire i caratteri speciali in entità HTML 'innocue'; addslashes() produce una stringa contenente '\' anteposto ai caratteri che richiedono il quoting nelle query dei database come: apici singoli, doppi apici, backslash e il byte NULL; infine, md5() converte una stringa in un numero esadecimale di 32 caratteri all'interno del quale essa viene criptata.
Attenzione: questo articolo è stato concesso in esclusiva per la pubblicazione a Mrwebmaster.it; ne è vietata la riproduzione,
anche parziale, senza l'esplicito consenso dell'autore e della redazione di Mrwebmaster.it.
|