Maison >développement back-end >tutoriel php >Les instructions préparées par PDO empêchent-elles toujours l'injection SQL ?

Les instructions préparées par PDO empêchent-elles toujours l'injection SQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-28 00:31:10432parcourir

Do PDO Prepared Statements Always Prevent SQL Injection?

Les instructions préparées PDO sont-elles suffisantes pour empêcher l'injection SQL ?

Les instructions préparées PDO (PHP Data Objects) sont un outil puissant pour se protéger contre SQL injection. Cependant, il est important de comprendre leurs limites pour véritablement se prémunir contre cette vulnérabilité.

Le problème avec les préparations émulées :

Par défaut, PDO émule les instructions préparées pour MySQL. Cependant, cette émulation présente une faille de sécurité que des attaquants expérimentés peuvent exploiter. Dans ce scénario d'attaque :

  1. Le jeu de caractères du serveur est défini sur celui qui prend en charge les caractères multi-octets codés avec un ' d'échappement (barre oblique inverse).
  2. Une charge utile est conçue et contient une combinaison de caractères multioctets invalides.
  3. PDO appelle en interne la fonction MySQL C API mysql_real_escape_string() pour échapper à la charge utile, ce qu'il fait en fonction du jeu de caractères de connexion.
  4. Les caractères multi-octets non valides dans la charge utile sont traités comme des octets simples valides, ce qui donne un caractère ' non échappé.
  5. Ce caractère ' échappé peut être utilisé pour créer un Attaque par injection SQL.

Prévenir l'attaque :

Pour empêcher cela attaque, vous pouvez désactiver les instructions préparées émulées en définissant l'attribut PDO PDO::ATTR_EMULATE_PREPARES sur false. Cela oblige PDO à utiliser de véritables instructions préparées, qui sont plus sécurisées.

Vous pouvez également atténuer l'attaque en :

  • En utilisant un jeu de caractères non vulnérable pour le codage de la connexion, tel que UTF-8.
  • Activation du SQL NO_BACKSLASH_ESCAPES mode.

Exemples sûrs :

Les exemples suivants illustrent une utilisation sûre des instructions préparées par PDO :

// Disable emulated prepares and use non-vulnerable character set
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$query = 'SELECT * FROM users WHERE username = ?';
$stmt = $dbh->prepare($query);
$stmt->execute( array(':username' => $_REQUEST['username']) );
// Use DSN charset parameter in PHP ≥ 5.3.6
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=gbk', $user, $password);
$query = 'SELECT * FROM users WHERE username = ?';
$stmt = $dbh->prepare($query);
$stmt->execute( array(':username' => $_REQUEST['username']) );

Dans En conclusion, l'utilisation des préparations PDO est généralement suffisante pour empêcher l'injection SQL, mais il est crucial d'être conscient et d'atténuer les vulnérabilités potentielles. En comprenant les limites des instructions préparées émulées et en garantissant des configurations compatibles, vous pouvez protéger efficacement vos applications contre les injections malveillantes.

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!

Déclaration:
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