Sécurité & BDD • Niveau Débutant (12 ans & +)
Temps de lecture : 8 minutes • +25 XP Gardien du Trésor

PDO & Sécurité : Le Coffre-Fort du Shogun et les Parchemins Piégés

Comment protéger les trésors du village contre les attaques par injection SQL grâce à la boîte aux lettres blindée des requêtes préparées.

Chapitre 1

La Base de Données : La Chambre Forte du Fief

Dans les sous-sols du château d'OpenShogun se trouve la pièce la plus précieuse de tout l'empire : la grande réserve centrale (la Base de Données MySQL).

Elle contient des milliers de grands casiers organisés en tableaux (les tables SQL) :

  • Le casier users avec les pseudos et mots de passe secrets des chefs de guerre.
  • Le casier resources qui compte chaque grain de riz, planche de bois et minerai de fer.
  • Le casier planet_buildings qui mémorise la hauteur de tes murailles et le niveau de ton donjon Tenshu.

Pour parler au grand archiviste qui garde cette pièce, on utilise un langage spécial : le SQL (Structured Query Language). Par exemple :
SELECT bois, fer FROM resources WHERE user_id = 12;

L'Archiviste du Château (MySQL)

L'archiviste est extrêmement obéissant et très rapide... mais il est un peu trop naïf ! Il exécute au pied de la lettre TOUS les ordres qu'on lui donne sous forme de texte SQL.

Si on lui donne un ordre pirate, il l'exécute sans hésiter !
Chapitre 2

L'Attaque par Injection SQL : Le Parchemin Piégé du Bandit

Le piège de la phrase collée (concaténation)

Imagine qu'un développeur distrait écrive son code en collant simplement le pseudo tapé par le joueur dans la phrase SQL :

// CODE DANGEREUX À NE JAMAIS FAIRE !
$sql = "SELECT * FROM users WHERE pseudo = '$pseudoTape'";

Si un bandit rusé se présente au formulaire de connexion et entre comme pseudo ce texte étrange :
' OR '1'='1

La phrase finale lue par l'archiviste devient :
SELECT * FROM users WHERE pseudo = '' OR '1'='1'

Comme 1 est TOUJOURS égal à 1, la condition est vraie pour tout le monde ! L'archiviste ouvre la porte en grand et le pirate est connecté sur le compte du premier joueur, voire de l'administrateur suprême !
Autopsie du piratage injection_demo.sql

Le Coffre est Ouvert Sans Mot de Passe !

En glissant des guillemets et des mots-clés SQL dans un champ de texte innocent, le pirate a transformé une simple donnée en un ordre de triche.

Le savais-tu ? L'histoire de « Little Bobby Tables »
Une bande dessinée très célèbre chez les programmeurs (du site xkcd) raconte l'histoire d'une maman qui a appelé son fils : Robert'); DROP TABLE Students;--. Quand l'école a enregistré son nom dans son ordinateur mal protégé, la base de données a interprété le nom comme un ordre de destruction et a effacé toute la liste des élèves de l'école !
Chapitre 3

La Solution Magique PDO : Les Requêtes Préparées

Pour neutraliser définitivement ces attaques ninja, les bâtisseurs d'OpenShogun utilisent PDO et ses requêtes préparées (prepare et execute).

Imagine cela comme une boîte aux lettres magique avec une fente blindée. Au lieu de tout mélanger, le système sépare strictement l'action en deux étapes :

L'Ordre Gravé dans la Pierre
Avec $db->prepare(...), on donne l'ordre SQL avec un trou marqué par un point d'interrogation ? (ou :pseudo). L'archiviste prépare le casier à l'avance.
La Donnée Glissée dans la Fente
Avec $stmt->execute([$pseudo]), la valeur est transmise à part. Elle est traitée comme du texte pur et inoffensif, jamais comme un ordre exécutable !

Même si un joueur tape ' OR '1'='1 ou DROP TABLE, MySQL se dit simplement : « Tiens, un joueur qui s'appelle bizarrement Monsieur Parchemin ! Je vais chercher un joueur qui a exactement ce nom bizarre ». Rien n'explose, le château reste inviolable !

Le Code Blindé OpenShogun Database.php
// Étape 1 : On prépare le modèle d'ordre
$stmt = $db->prepare(
  "SELECT * FROM users WHERE pseudo = :nom"
);

// Étape 2 : On injecte la valeur isolée
$stmt->execute([
  ':nom' => $pseudoDuJoueur
]);

// Étape 3 : On lit les résultats sans peur !
$joueur = $stmt->fetch();

Le Défi de Gabriel : Teste tes Connaissances Sécurité !

2 Questions

Prouve que tu es digne de garder les clés de la chambre forte en répondant sans faute aux deux énigmes !

Question 1 Comment un pirate tente-t-il de réussir une Injection SQL ?

Question 2 Pourquoi les requêtes préparées (prepare / execute) sont-elles invulnérables ?