Xanetiz > Programmation > Les injections SQL
Une base de données (BDD) comme son nom l'indique est faite pour contenir des données de manière organisée. On peut la visualiser comme un tableau.
Chaque colonne représente un attribut et chaque ligne représente un tuple. Un regroupement d'attributs représente une table.
On peut voir les tables comme des livres que l'on rangerait dans des bibliothèques : les bases de données.
Les requêtes SQL sont des commandes qui permettant de questionner une base de données afin de recevoir des données précises. Ainsi, on peut demander de nous renvoyer la liste des utilisateurs inscris sur un site ou le titre des news sur une page d'accueil. Ces deux requêtes sont indépendantes des utilisateurs parcourant votre site. Par exemple (avec la table précédente) :
SELECT Marque FROM Ordinateur;
Cette requête va nous renvoyer la liste des marques contenues dans la table ordinateur.
Un système de connexion à un site va aussi utiliser une requête SQL pour vérifier si le pseudo et le mot de passe saisis correspondent bien à un utilisateur inscrit au site. Ces données étant stockées dans une base de données, il va falloir comparer avec tous les utilisateurs présents dans la table correspondant aux membres. La requête est ainsi dépendante des informations saisies par l'utilisateur, elle les utilise dans sa requête. Par exemple :
SELECT pseudo, mdp FROM membres WHERE pseudo = '$pseudo' AND mdp = '$pass';
$pseudo représente le pseudo que l'utilisateur a tapé dans la zone de saisie "Pseudonyme", pareil pour $pass qui représente le mot de passe. Normalement, si la transmission se fait par POST, ces deux variables auraient la forme $_POST['pseudo'] et $_POST['mdp'].
L'injection SQL représente le fait qu'un utilisateur va saisir des informations qui vont être utilisées dans une requête SQL de manière à modifier son fonctionnement. Le but est donc de changer la requête à son profit. Pour ça, il suffit d'ajouter un caractère de fin de chaîne dans le champ de saisie et insérer ce que l'on veut ensuite ou terminer la requête.
Si un utilisateur tape dans le champ "Pseudo" ceci : Baptiste '; -- la requête va être transformée en :
SELECT pseudo, mdp FROM membres WHERE pseudo = 'Baptiste';
Plus besoin de mot de passe, la connexion est réussie. Vous avez donc en quelque sorte envoyé du SQL dans le champ réservé au pseudo, d'où le nom injection SQL.
Si la requête est effectuée en PHP avec MySQL, l'utilisateur pourrait taper : Baptiste "); #
Avant :
mysql_query("SELECT pseudo, mdp FROM membres WHERE pseudo = '$pseudo' AND mdp = '$mdp' ");
Après :
mysql_query("SELECT pseudo, mdp FROM membres WHERE pseudo = 'Baptiste' ");
Heureusement, la protection est très simple. Il suffit juste d'utiliser la fonction mysql_real_escape_string(). Celle-ci va tout simplement désactiver les caractères de fins de chaînes comme ' ou ". Pour cela, elle va ajouter des antislashs \ devant afin de les échapper, c'est à dire qu'ils seront considérés comme de simples caractères.
Ainsi, pour chaque fonction SQL qui utilise des informations envoyées par un utilisateur, vous devez placer les variables dans la fonction mysql_real_escape_string avant d'exécuter la requête.
Dans notre cas, ça aurait donné :
mysql_real_escape_string($pseudo);
mysql_real_escape_string($mdp);
mysql_query("SELECT pseudo, mdp FROM membres WHERE pseudo = '$pseudo' AND mdp = '$mdp' ");
La requête est maintenant securisée.
Titre | Vu | Date | |
---|---|---|---|
L'essentiel du langage XHTML | 6 099 | 13/03/10 | |
Le XML | 7 391 | 13/02/10 | |
Placer un copyright sur ses images en PHP | 6 112 | 04/04/12 | |
Utiliser un IDE pour programmer | 6 843 | 25/02/10 | |
L'essentiel du langage C | 17 835 | 14/03/10 |
Nombre d'inscrits : 262
Dernier membre : Clyderar
Visiteurs en ligne : 6
Membres en ligne : Aucun
Copyright © 2022 Xanetiz.com - Tous droits réservés