blog actif depuis 1328 jours.

retours d'expériences, codes sources, réflexions, humeurs... d'un webmaster

 

Mar.

01

Juil.

 

L'injection de code SQL est une technique consistant à placer du code SQL dans les champs des formulaires. Ce code va s'insérer dans les requêtes SQL de la page qui exploitera les données du formulaire.

Il existe des précautions simples à mettre en place pour sécuriser vos formulaires et parer ce genre d'attaque.


Précaution no 1
Passer la variable register_globals à off, pour ne pas que les variables d'environnement, GET, POST, COOKIE et SERVER soient enregistrées comme des variables globales.
Ex : Pour traiter un formulaire avec la méthode POST, les données seront accessibles via les variables $_POST. Ce qui évite l'injection de données via l'url.
register_globals est à off par défaut depuis PHP 4.2.0.

Précaution no 2
Mettre magic_quotes_gpc (le serveur ajoutera un caractère d'échappement «  » devant tous les quotes) ou mieux, sécuriser les données de la variable $_POST à l'aide d'une fonction qui analyse et transforme les caractères spéciaux.

Précaution no3
Toujours encadrer les valeurs dans vos requêtes d'apostrophes :
SELECT * FROM table WHERE champ='val' plutôt que SELECT * FROM table WHERE champ=val
Ceci permettra de rendre plus difficile l'injection de code SQL.


Exemple :
Prenons par exemple un formulaire d'identification avec un champ « login » et un champ « passwd »
Les infos de connexion sont enregistrées dans une base MySQL. Pour vérifier que l'utilisateur peut se connecter, on lance la requête
SELECT * FROM table_utilisateurs WHERE identifiant ='$_POST['login']' AND passwd='$_POST['passwd']';
Exemple d'attaque :
On saisit dans le champ login "' OR 1 OR '" et dans le champ passwd "jhlsds"  :
La requête devient
SELECT * FROM table_utilisateurs WHERE identifiant ='' OR 1 OR '' AND passwd='jhlsds';
Cette requête retournera la liste des utilisateurs enregistrés et peut permettre d'être connecté via le premier trouvé (qui souvent est l'administrateur !!!)

Avec magic_quotes_gpc, on optient
SELECT * FROM table_utilisateurs WHERE identifiant ='' OR 1 OR ''' AND passwd='jhlsds';
Ce qui ne retournera rien.

 

Commentaires

L'utilisation des magic_quotes n'est pas suffisante pour contrer l'injection SQL.
Dans tous les cas il faut vérifier les informations saisies dans le formulaire : types de valeurs attendues, texte indésirable (morceaux de requetes, de code...)

11/02/2009

 

Ajouter un commentaire

nom / pseudo :
e-mail :

(Votre e-mail ne sera ni exploité, ni divulgué.)

site (facultatif)
 
romualb.com est sur Facebook
<Février 2012 
LunMarMerJeuVenSamDim
  01 02 03 04 05
06 07 08 09 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29