Fil d'Ariane : Consultant Expert Web > Société > How to > How to Hébergement > Faille "SQL Injection"
Comment s'en prémunir et un exemple concret de la puissance de cette faille.
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).
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.
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';
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).
$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;
if (is_numeric($_GET['Delete']))
// et non pas $_GET[Delete] != '' ou même isset($_GET['Delete'])
delete from TABLE where ID=$_GET[Delete]
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é.