PHP et Injection SQL : 4 façons de sécuriser votre site web

L'injection SQL (SQLi) est un type d'attaque qui peut permettre aux attaquants d'exécuter des requêtes malveillant sur une base de données SQL. 💉
Cela peut leur permettre d'accéder à des données sensibles ou même de prendre le contrôle de la base de données entière. Dans cet article, nous discuterons de la façon de protéger votre application web PHP des attaques d'injection SQL.


 

Qu'est-ce que l'injection SQL?

 

Définition


L'injection SQL est un type d'attaque qui peut être utilisé pour exploiter les applications web qui utilisent une base de données SQL. Ce type d'attaque permet à l'attaquant d'insérer du code malveillant dans une instruction SQL, qui peut alors être exécuté par le serveur de base de données.
 

Pour que ce type d'attaque fonctionne, l'attaquant doit d'abord trouver une application web vulnérable. L'un des moyens les plus courants pour trouver des applications web vulnérables est d'utiliser les moteurs de recherche. L'attaquant peut utiliser des opérateurs spéciaux pour rechercher des sites web vulnérables aux attaques d'injection SQL. Par exemple, ils pourraient utiliser l'opérateur inurl pour rechercher des pages qui contiennent certains termes dans leur URL ou l'opérateur filetype pour rechercher des types de fichiers spécifiques, tels que des scripts SQL.
 

Une fois que l'attaquant a trouvé un site web vulnérable, il peut alors commencer à concevoir sa requête SQL malveillante. La façon la plus courante de le faire est d'utiliser une requête UNION. Une requête UNION est deux ou plusieurs requêtes qui sont combinées en une seule déclaration.
L'attaquant peut utiliser ce type de requête pour injecter son propre code dans la requête d'origine.


Il existe 3 types d'injection SQL, ce ne sera pas le sujet de cet article de les expliquer, mais je vous mets des liens vers de très bons articles :
 

 

Exemple d'injection SQL


Voici un exemple bien connu d'injection SQL où l'attaquant parvient à injecter or 1=1;-- à la fin d'une requête SQL en raison d'un manque de validation / filtre de saisie de l'utilisateur côté serveur.



La partie or 1=1;-- est une condition qui est toujours vraie (le -- est utilisé pour commenter la fin de la ligne SQL), ce qui signifie qu'elle sélectionnera toutes les lignes de la table utilisateurs quelle que soit la valeur de l'ID de l'utilisateur. Cela permet à une personne malveillante de voir (ou déduire en cas de blind injection) toutes les informations utilisateur de la base de données, même si elle est normalement protégée par un système d'authentification ou d'autorisation.


 

4 façons de se protéger des injections SQL en PHP

 

Requêtes paramétrées

 

Les requêtes paramétrées sont un moyen d'éviter les injections SQL en s'assurant que les entrées de l'utilisateur ne peuvent être traitées que comme des données, et non pas comme une partie de la requête SQL. Cela se fait en utilisant des valeurs de paramètres fictifs dans la requête SQL, qui sont ensuite remplacées par les valeurs réelles au runtime.

Par exemple, disons que nous avons un formulaire sur notre site qui permet aux utilisateurs de saisir leur nom et adresse email. Nous pourrions utiliser une requête paramétrée pour insérer ces données dans notre base de données, comme ceci:
 

INSERT INTO users (name, email) VALUES (?, ?)


Remarquez que nous avons utilisé deux points d'interrogation comme valeurs de paramètres fictifs pour nos paramètres nom et email. Nous pouvons alors utiliser la méthode PDO::prepare() pour préparer notre requête SQL :
 

$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)');


Enfin, nous pouvons exécuter notre requête et passer les valeurs pour nos paramètres nom et email:
 

$stmt->execute([$name, $email]);


 

Échapper les caractères spéciaux.

 

Une autre façon de se protéger contre les injections SQL est d'échapper les caractères spéciaux de l'entrée de l'utilisateur avant de l'ajouter à la requête.
Par exemple, si nous avons un formulaire sur notre site web qui permet aux utilisateurs de rechercher des articles par mots-clés, nous pourrions utiliser la fonction mysql_real_escape_string() pour échapper tout caractère spécial dans les mots-clés avant de faire la recherche :
 

$keywords = mysql_real_escape_string($_GET['keywords']);

$sql = "SELECT * FROM posts WHERE title LIKE '%".$keywords."%'";


 

Utiliser une whitelist

 

Une troisième façon de se protéger contre les injections SQL est d'utiliser une whitelist de caractères autorisés pour l'entrée de l'utilisateur.
Par exemple, si nous avons un formulaire sur notre site web qui n'autorise les utilisateurs à entrer que des caractères alphanumériques (lettres et chiffres), nous pourrions utiliser la fonction ctype_alnum() pour vérifier si l'entrée contient d'autres caractères :
 

if (!ctype_alnum($input)) { 
  die("Erreur: Seuls les caractères alphanumériques sont autorisés."); 
}


 

Limiter les entrées de l'utilisateur

 

Une quatrième façon de se protéger contre les injections SQL consiste à limiter la quantité d'entrée de l'utilisateur que vous autorisez.
Par exemple, si nous avons un formulaire sur notre site Web qui permet aux utilisateurs d'entrer leur nom, adresse e-mail et mot de passe, nous pourrions utiliser la fonction strlen() pour vérifier si la longueur de l'entrée est supérieure à ce à quoi nous nous attendons :
 

if (strlen($input) > 255) { 
  die("Erreur : L'entrée doit être inférieure à 255 caractères."); 
}


 

Conclusion

 

Les injections SQL sont une grave menace de sécurité qui peut avoir des conséquences dévastatrices. Les sites web utilisant PHP sont particulièrement vulnérables aux attaques d'injection SQL.
Cependant, il existe des mesures que vous pouvez prendre pour protéger votre site Web. En utilisant les requêtes paramétrées, en échappant aux caractères spéciaux, en utilisant une liste blanche ou encore en limitant les entrées de l'utilisateur, vous pouvez rendre votre code invulnérable aux attaques d'injection SQL.

 


D'autres articles à découvrir :

2 commentaires

Avatar de l'auteur du commentaire
Guiguizaure
2 févr. 2023, 14:35:11
Très cool l'article ! Hâte du prochain 👊

Répondre
Avatar de l'auteur du commentaire
Hugo Derré
2 févr. 2023, 14:48:03
Merci à toi ! Du très lourd arrive pour le prochain article 🚀

Répondre