DELETE FROM Membre WHERE id =
De l'autre, l'id du client, par exemple 4.
Avec votre langage de programmation web préféré, vous mettez les deux ensemble pour créer la requête complète :
Code : SQL
DELETE FROM Membre WHERE id = 4;
Et maintenant, un méchant pirate s'amuse à modifier la donnée envoyée par le bouton "Supprimer compte" (oui oui, c'est faisable,
et même plutôt facile).
À la suite du numéro d'id , il ajoute OR 1 = 1. Après construction de la requête, on obtient donc ceci :
Code : SQL
DELETE FROM Membre WHERE id = 4 OR 1 = 1;
Et la seconde condition étant toujours remplie, c'est l'horreur : toute votre table Membre est effacée !
Et voilà ! Vous avez été victimes d'une injection SQL.
Comment une requête préparée peut-elle éviter les injections SQL ?
En utilisant les requêtes préparées, lorsque vous liez une valeur à un paramètre de la requête préparée grâce à la fonction
correspondante dans le langage que vous utilisez, le type du paramètre attendu est également donné, explicitement ou
implicitement. La plupart du temps, soit une erreur sera générée si la donnée de l'utilisateur ne correspond pas au type attendu,
soit la donnée de l'utilisateur sera rendue inoffensive (par l'ajout de guillemets qui en feront une simple chaîne de caractères par
exemple).
Par ailleurs, lorsque MySQL injecte les valeurs dans la requête, les mots-clés SQL qui s'y trouveraient pour une raison où une
autre ne seront pas interprétés (puisque les paramètres n'acceptent que des valeurs, et pas des morceaux de requêtes).
Gagner en performance
Lorsque l'on exécute une simple requête (sans la préparer), voici les étapes qui sont effectuées :
1. La requête est envoyée vers le serveur.
2. La requête est compilée par le serveur (traduite du langage SQL compréhensible pour nous, pauvres humains limités, vers
un "langage machine" dont se sert le serveur).
3. Le serveur crée un plan d'exécution de la requête (quelles tables utiliser ? quels index ? dans quel ordre ?…).
4. Le serveur exécute la requête.
5. Le résultat de la requête est renvoyé au client.
Voici maintenant les étapes lorsqu'il s'agit d'une requête préparée :
Préparation de la requête :
1. La requête est envoyée vers le serveur, avec un identifiant.
2. La requête est compilée par le serveur.
3. Le serveur crée un plan d'exécution de la requête.
4. La requête compilée et son plan d'exécution sont stockés en mémoire par le serveur.
5. Le serveur envoie vers le client une confirmation que la requête est prête (en se servant de l’identifiant de la requête).
Exécution de la requête :
1. L'identifiant de la requête à exécuter, ainsi que les paramètres à utiliser sont envoyés vers le serveur.
2. Le serveur exécute la requête demandée.
Partie 5 : Sécuriser et automatiser ses actions
263/414
www.openclassrooms.com
Précédent

- 263/413

Suivant