Maison > développement back-end > tutoriel php > Les instructions préparées par PDO sont-elles vraiment à l'abri des attaques par injection SQL ?

Les instructions préparées par PDO sont-elles vraiment à l'abri des attaques par injection SQL ?

Susan Sarandon
Libérer: 2024-12-26 01:48:09
original
549 Les gens l'ont consulté

Are PDO Prepared Statements Truly Safe from SQL Injection Attacks?

Les instructions préparées par PDO sont-elles immunisées contre les injections SQL ?

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.

Le vecteur d'attaque

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 :

  1. Le jeu de caractères de la base de données est défini à l'aide de SET NAMES (au lieu de mysql_set_charset()).
  2. Le client utilise des instructions préparées émulées (ou de véritables instructions préparées que le serveur MySQL traite comme émulées).

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.

Les correctifs

Prévention :

  • Désactiver les instructions préparées émulées : $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  • Utilisez le paramètre PDO DSN charset pour définir l'encodage des caractères (PHP >= 5.3.6) : $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=gbk ', $user, $password);
  • Évitez l'encodage vulnérable : utilisez des jeux de caractères comme UTF-8 ou Latin1 qui ne sont pas vulnérables à cela attaque.

Atténuation :

  • Activer le mode SQL NO_BACKSLASH_ESCAPES : cela modifie le comportement d'échappement des caractères, atténuant ainsi la vulnérabilité potentielle.

Exemples sûrs

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();
Copier après la connexion

Conclusion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal