Problèmes de requêtes PDO en PHP
Comme vous devez déjà le savoir, les requêtes SQL sont vulnérables aux injections SQL. L'extension PDO est conçue pour lutter contre les injections, mais par défaut, elle ne le fait pas automatiquement.
Examinons le problème avec un exemple. Supposons que nous ayons la requête suivante, dans laquelle une variable est insérée :
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Supposons que notre variable provienne de l'extérieur, par exemple, d'un paramètre GET. Pour simplifier, cependant, définissons simplement sa valeur manuellement. Nous nous attendons à une valeur numérique, par exemple, comme celle-ci :
<?php
$id = 1;
?>
Un hacker malveillant, cependant, pourrait transmettre
la valeur suivante (supposons que nous ayons
un champ role) :
<?php
$id = '-1 OR role="admin"';
?>
Il en résulte que nous voulions la requête suivante :
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Mais nous avons obtenu la suivante, qui récupère l'administrateur du site :
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Pour éviter cette situation, PDO dispose d'un mécanisme spécial, appelé requêtes préparées. Nous les examinerons dans la prochaine leçon.
Effectuez intentionnellement une injection SQL sur votre base de données.