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!
<? $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.