Injection SQL et requêtes paramétrées
Éliminer les risques d’injection en utilisant toujours des instructions préparées avec PDO.
Injection SQL et requêtes paramétrées est une leçon PHP Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage PHP Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours PHP Academy comprend 4 leçons au total.
Qu’est-ce que l’injection SQL ?
L’injection SQL se produit lorsque des données fournies par l’utilisateur sont intégrées directement dans une requête SQL, ce qui permet aux attaquants de manipuler la requête pour accéder à des données, les modifier ou les supprimer.
Exemple classique
Concaténer les données saisies par l’utilisateur dans du SQL :
<?php
// VULNERABLE: attacker enters username = "' OR '1'='1"
$sql = "SELECT * FROM users WHERE username = '".$_GET["username"]."'";
// Becomes: SELECT * FROM users WHERE username = '' OR '1'='1'
// Returns ALL users!Exemple d’exfiltration de données
Un attaquant utilise UNION SELECT pour extraire des données d’autres tables.
// Input: ' UNION SELECT username, password FROM admin_users--
// This appends a second SELECT returning admin credentialsLes requêtes préparées sont la solution
Avec les requêtes préparées, la structure de la requête est fixée avant toute transmission de données. La base de données traite toutes les valeurs liées comme des données littérales, jamais comme du code SQL.
<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET["username"]]);
// Safe even if username = "' OR 1=1--"Paramètres nommés
Les paramètres nommés sont plus clairs, en particulier lorsque plusieurs paramètres sont utilisés.
<?php
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE email = :email AND active = :active"
);
$stmt->execute([":email" => $email, ":active" => true]);Eloquent est sûr par défaut
Laravel Eloquent utilise en interne des requêtes préparées PDO pour toutes les opérations standard du générateur de requêtes.
<?php
// Safe:
User::where("email", $email)->first();
// UNSAFE: raw query with user input!
DB::select("SELECT * FROM users WHERE email = ".$email);Requêtes brutes
Lorsque vous devez utiliser du SQL brut dans Laravel, utilisez toujours des paramètres liés.
<?php
// Safe raw query:
$users = DB::select("SELECT * FROM users WHERE email = ?", [$email]);
// Or with named bindings:
$users = DB::select("SELECT * FROM users WHERE email = :email", [":email" => $email]);Injection dans une clause LIKE
Les clauses LIKE nécessitent un traitement particulier : les caractères génériques (%, _) doivent être échappés manuellement avant la liaison.
<?php
$search = str_replace(["%", "_", "\\"], ["\%", "\_", "\\\\"], $userInput);
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);Injection dans ORDER BY
Les noms de colonnes et les directions de ORDER BY ne peuvent pas être paramétrés. Validez-les par rapport à une liste blanche.
<?php
$allowedColumns = ["name", "price", "created_at"];
$col = in_array($request->sort, $allowedColumns) ? $request->sort : "name";
$dir = $request->dir === "desc" ? "desc" : "asc";
// Then safely build the query stringProcédures stockées
Les procédures stockées peuvent également être vulnérables si elles concatènent des données saisies en interne. Utilisez toujours des appels paramétrés.
Principe du moindre privilège
L’utilisateur de la base de données qui se connecte depuis PHP ne devrait disposer que des privilèges SELECT/INSERT/UPDATE/DELETE sur les tables nécessaires, jamais des privilèges CREATE, DROP ou d’administration.
Résumé
Utilisez ALWAYS des requêtes préparées avec des paramètres liés. Ne concaténez jamais les données saisies par l’utilisateur dans du SQL. Validez ORDER BY et les noms de colonnes par rapport à une liste blanche. Utilisez PDO avec les requêtes préparées émulées désactivées.
Vérification rapide
Quelle est la bonne façon de se protéger contre l’injection SQL ?
Questions Fréquemment Posées
La leçon « Injection SQL et requêtes paramétrées » est-elle gratuite ?
Oui — le texte complet de « Injection SQL et requêtes paramétrées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours PHP Academy, passe à CoddyKit PRO. Le cours PHP Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Injection SQL et requêtes paramétrées » ?
Éliminer les risques d’injection en utilisant toujours des instructions préparées avec PDO. Tu pratiques PHP Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer PHP Academy ?
Aucune expérience préalable n'est requise. PHP Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Injection SQL et requêtes paramétrées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon PHP Academy ?
Oui. Chaque leçon PHP Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Prévenir les attaques par script intersite (XSS)
- Injection SQL et requêtes paramétrées
- Protection contre les attaques CSRF
- Stockage sécurisé des mots de passe