Bien que la documentation PDO suggère que la préparation des instructions élimine le besoin de citer manuellement les paramètres, la réponse est un « oui » nuancé ". PDO émule par défaut les instructions préparées pour MySQL, et cette émulation peut parfois créer des vulnérabilités exploitables.
La vulnérabilité potentielle survient lorsque l'encodage de la connexion implique des jeux de caractères vulnérables spécifiques (par exemple, gbk , cp932) et les conditions suivantes sont remplies :
Dans de tels cas, un attaquant peut créez une charge utile contenant un caractère multi-octets non valide et exploitez l'écart entre le jeu de caractères attendu sur le client et le jeu de caractères réel de la connexion. Cela leur permet d'injecter un caractère sans guillemets dans la chaîne de requête générée, conduisant à des injections SQL potentielles.
Prévention :
Atténuation :
Les extraits de code suivants illustrent des pratiques sûres :
// PDO without emulated prepares $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(array("xbf' OR 1=1 /*")); // PDO with DSN charset parameter $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=gbk', $user, $password); $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(array("xbf' OR 1=1 /*")); // MySQLi (always uses true prepared statements) $mysqli->query('SET NAMES gbk'); $stmt = $mysqli->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $param = "xbf' OR 1=1 /*"; $stmt->bind_param('s', $param); $stmt->execute();
Les instructions préparées par PDO peuvent empêcher efficacement les injections SQL lorsqu'elles sont utilisées correctement et en conjonction avec des pratiques sécurisées. Il est crucial d'éviter l'encodage vulnérable, de désactiver les préparations émulées ou d'activer le mode NO_BACKSLASH_ESCAPES pour atténuer les vulnérabilités potentielles.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!