Se prémunir contre les injections de codes SQL !

Formation au langage SQL à Lille (Nord)
Attaques par injection SQL

L’attaque par injection SQL est l’une des plus fréquentes sur Internet, mieux vaut s’en prémunir ! Même les plus grands ont déjà eu maille à partir avec cette technique de piratage. Notamment, Sony qui en a fais les frais en 2011 suite à un piratage de grande ampleur qui s’est soldé par le vol de plusieurs millions de logins et mots de passe.

Pour tout dire, l’attaque par injection est très utilisée et c’est même la deuxième la plus en vue juste derrière les attaques par force brute qui consistent à passer en revue de manière exhaustive toutes les combinaisons possibles (un robot se chargeant de cette tâche) notamment pour les mots de passe.

L’injection pour sa part, consiste à insérer en douce des ordres SQL inattendu dans des formulaires HTML voire lors d’appel de fichiers du genre PHP ou ASP qui utilisent la méthode GET pour récupérer des variables ou arguments et ainsi de contourner le système d’information en vue de capter des données ou d’être malveillant.

Voici un exemple typique :

Votre requête ressemble à ceci :

$query = ‘SELECT * FROM tbl_users WHERE password= »‘.$_GET[‘password’].' »‘;

Si $_GET[‘password’]=’tutu’, il n’y aucun problème car la requête deviendra après coup la suivante :

Toutefois, si l’utilisateur réussi à passer $_GET[password]=’tutu' » OR 1=1′, là, il y a problème car la requête deviendra alors :

$query = ‘SELECT * FROM users WHERE password = « tutu » OR 1=1’;

On parle ici du « 1 magique » puisque la condition est réalisée à coup sûr !

L’utilisateur pourrait ainsi essayer de détourner ou de collecter à votre insu des données issues de votre système d’informations. Ou voire pis, vous nuire car on imagine alors aisément ce qu’il pourrait advenir par la suite sur des requêtes du type UPDATE ou DELETE… Vous l’aurez compris, mieux vaut prévenir que guérir !

Parer les attaques par injection

1 – Filtrer toutes les données récupérées avec les méthodes POST ou GET à l’aide d’une fonction. Voici un exemple PHP :

function formatTagValue($theValue) {

if (get_magic_quotes_gpc()) {
$theValue = stripslashes($theValue);
}

$theValue = mysql_real_escape_string($theValue);
return $theValue;

}

La requête devient alors :

$query = ‘SELECT * FROM tbl_users WHERE password= »‘. formatTagValue ($_GET[‘password’]).' »‘;

2 – Utiliser une requête préparée où une procédure stockée dont la structure n’est plus modifiable par la suite. Toujours en PHP, voici un exemple :

$query = ‘INSERT INTO tbl_users (name, password, sexe) VALUES (?, ?, ?);’
$st = $mysqli->prepare($query );
if ($st){

$st->bind_param(‘sss’, $name, $password, $sexe);
// pour info, c’est s pour string d’où sss
$st->execute();

}

Du fait que la requête soit préparée avant de renseigner ses paramètre, il n’est plus possible de modifier sa syntaxe.

Petit bonus, la requête compilée sollicite moins le serveur de base de données dans le cas où elle est exécutée à de nombreuses reprises puisque le cache est de la partie.

La plupart des bases de données dont MySQL ou encore Oracle offrent aujourd’hui cette possibilité alors il serait dommage de s’en priver !

Vaccinez vous contre les attaques par injection SQL !!

Se prémunir contre les injections de codes SQL !
Votez pour ce billet !

2 thoughts on “Se prémunir contre les injections de codes SQL !”

  1. Très bon article pour se protéger des injections SQL. Ces failles sont facilement accessible à un hacker alors qu’un petit PDO ou mysqli_real_escape_string() ne sont pas dur à mettre en place pour se protéger d’une attaque. Outre l’intérêt pour la sécurité d’une application, une procédure stockée c’est une solution tellement plus « propre ».

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *