Cybercursus

Fiche de révision — Injections SQL

Mise à jour le 6 août 2026

Le problème : concaténer au lieu de paramétrer

-- Vulnérable : la valeur est concaténée dans le texte SQL
SELECT * FROM utilisateurs WHERE identifiant = '${identifiant}'

La protection : une requête préparée

-- Sûr : la valeur est transmise à part, jamais interprétée comme du SQL
SELECT * FROM utilisateurs WHERE identifiant = ?

💡 Astuce

Une requête préparée neutralise ' OR '1'='1 aussi bien que UNION SELECT : la base de données traite toujours la valeur fournie comme une donnée brute, jamais comme une instruction.

L'essentiel

Pourquoi une requête SQL construite par concaténation est-elle dangereuse ?

Parce qu'elle mélange le code SQL écrit par le développeur et les données fournies par l'utilisateur : rien ne distingue plus une donnée d'une instruction SQL aux yeux du moteur de base de données.

Que produit la valeur ' OR '1'='1 insérée dans un mot de passe concaténé ?

Une condition WHERE toujours vraie : '1'='1' l'est systématiquement, donc la requête retourne un utilisateur sans que le bon mot de passe ait été fourni.

À quoi sert un commentaire SQL (--) dans une charge d'injection ?

À ignorer le reste de la requête d'origine, y compris une seconde condition qui suivrait la vérification du mot de passe.

Que doit vérifier une injection UNION SELECT pour fonctionner ?

Retourner le même nombre de colonnes que la requête d'origine, avec des types compatibles.

Comment déterminer le nombre de colonnes d'une requête à l'aveugle ?

En incrémentant un ORDER BY jusqu'à provoquer une erreur : une erreur sur ORDER BY N indique que la requête retourne N-1 colonnes.

Quelle est la protection efficace contre les injections SQL ?

Les requêtes préparées (paramétrées) : la valeur est transmise séparément du texte SQL, jamais concaténée dans la requête elle-même.

Recherche