Fil d'Ariane : Consultant Expert Web > Société > How to > How to Hébergement > Faille "SQL Injection"

Se prémunir d'une attaque de type "SQL Injection"

Comment s'en prémunir et un exemple concret de la puissance de cette faille.

Une faille de sécurité potentielle de certains sites utilisant une base de données

Cette faille se nomme "SQL Injection" et consiste à modifier une requête SQL générée dynamiquement. Nous la trouvons notamment sur les sites exploitant le système de gestion de base de données SQLserver, car celui-ci permet d'exécuter plusieurs instructions en une seule requête. La faille concerne toutes les requêtes dont les paramètres ne sont pas neutralisés.
En cas de défaillance, il est ainsi possible pour tout internaute mal intentionné d'exécuter n'importe quelle requête sur n'importe quelle donnée du site (modification ou suppression de données).

Mettre en place une protection

La protection passe par une neutralisation des paramètres exploités dans les requêtes de base de données de trois manières différentes suivant la nature du paramètre.

Une chaîne de caractères

Les requêtes où une chaîne de caractères est attendue doivent être protégées en « échappant » les apostrophes. Ceci se réalise automatiquement en PHP avec la variable magic_gpc à on.

Le code à insérer est :

$param = replace("'", "'", $_GET['param']);
select * from TABLE where COLONNE = '$param';

Un nombre

Pour les requêtes où un nombre est attendu, le but est de s'assurer d'avoir bien un nombre et non une chaîne alphanumérique. Plusieurs méthodes (exemples en PHP) sont exploitables en fonction du type de nombre (entier, flottant).

--> convertir automatiquement les paramètres

$param = intval($_GET['param']);
select * from TABLE where COLONNE = $param;

$param2 = floatval($_POST['param2']);
$id = intval($_POST['id']);
update TABLE set COLONNE=$param2 where ID=$id;

--> s'assurer d'avoir le bon type

if (is_numeric($_GET['Delete']))
// et non pas $_GET[Delete] != '' ou même isset($_GET['Delete'])
 delete from TABLE where ID=$_GET[Delete]

Le tri par colonne

select * from TABLE order by $param

Ici, le problème est plus complexe. Un texte est attendu, mais il ne faut pas « échapper » les apostrophes. Ainsi, il est nécessaire de s'assurer qu'aucun point virgule (séparateur d'instructions dans une requête) n'apparaît…
 
N'hésitez pas à nous solliciter pour étudier tout cas particulier qui n'entre pas dans ces trois méthodes de protection et de neutralisation de la faille de sécurité "SQL Injection" et pour vérifier que votre site est correctement protégé.