Par Valentin Brosseau / @c4software
Une requête SQL mélange deux choses :
SELECT * FROM users WHERE id =42Que se passe-t-il si l'utilisateur choisit lui-même la donnée ?
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";La donnée de l'utilisateur est collée directement dans la requête.
Et si je visite la page avec :
?id=1 OR 1=1À votre avis, que renvoie la requête ?
SELECT * FROM users WHERE id = 1 OR 1=11=1 est toujours vrai : la base renvoie tous les utilisateurs.
On a laissé l'utilisateur écrire du SQL.
Sa donnée a été interprétée comme du code.
$sql = "SELECT * FROM users WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);Le ? est un emplacement : la donnée n'est jamais mélangée au code.
$sql = "SELECT * FROM users WHERE id = $id";
$pdo->prepare($sql)->execute();Est-ce protégé ? La requête est bien « préparée »…
La donnée a déjà été collée dans la chaîne avant le prepare.
Préparer une requête déjà concaténée ne protège de rien.
Un placeholder ? :
'?' ne marche pas) ;C'est execute([...]) qui apporte la donnée.
? + execute([...]).Place au TP 🚀