112 votes

AOP prise en charge de plusieurs requêtes (PDO_MYSQL, PDO_MYSQLND)

Je sais que PDO ne prend pas en charge plusieurs requêtes arriver exécutée en une seule instruction. J'ai été Googleing et trouvé quelques postes de parler de PDO_MYSQL et PDO_MYSQLND.

PDO_MySQL est plus dangereux l'application de toute autre traditionnelles MySQL applications. Traditionnelle MySQL ne permet qu'une seule requête SQL. Dans PDO_MySQL il n'y a pas une telle limitation, mais on risque d'être injecté avec plusieurs requêtes.

De: Protection contre les injections SQL en utilisant PDO et le Zend Framework (juin 2010, par Julien)

Il semble que PDO_MYSQL et PDO_MYSQLND ne fournir un soutien pour plusieurs requêtes, mais je ne suis pas en mesure de trouver plus d'informations à leur sujet. Ces projets abandonnées? Est-il possible maintenant d'exécuter plusieurs requêtes à l'aide de l'AOP.

153voto

Sam Dark Points 2813

Que je sache, PDO_MYSQLND remplacé PDO_MYSQL en PHP 5.3. Déroutant, c'est que le nom est encore PDO_MYSQL. Alors maintenant, ND est pilote par défaut pour MySQL+AOP.

Dans l'ensemble, afin d'exécuter plusieurs requêtes à la fois, vous devez:

  • PHP 5.3+
  • mysqlnd
  • Des émules déclarations préparées à l'avance. Assurez - PDO::ATTR_EMULATE_PREPARES est définie à l' 1 (par défaut). Sinon, vous pouvez éviter d'utiliser des requêtes préparées et utiliser $pdo->exec directement.

En utilisant exec

$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');

// works regardless of statements emulation
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);

$sql = "
DELETE FROM car; 
INSERT INTO car(name, type) VALUES ('car1', 'coupe'); 
INSERT INTO car(name, type) VALUES ('car2', 'coupe');
";

try {
    $db->exec($sql);
}
catch (PDOException $e)
{
    echo $e->getMessage();
    die();
}

À l'aide de relevés

$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');

// works not with the following set to 0. You can comment this line as 1 is default
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);

$sql = "
DELETE FROM car; 
INSERT INTO car(name, type) VALUES ('car1', 'coupe'); 
INSERT INTO car(name, type) VALUES ('car2', 'coupe');
";

try {
    $stmt = $db->prepare($sql);
    $stmt->execute();
}
catch (PDOException $e)
{
    echo $e->getMessage();
    die();
}

Une remarque:

Lors de l'utilisation des émules déclarations préparées à l'avance, assurez-vous de régler correctement l'encodage (qui reflète les données réelles de l'encodage) dans DSN (disponible depuis 5.3.6). Sinon, il peut y avoir une légère possibilité pour l'injection SQL si certains impairs encodage utilisé.

0voto

user2118559 Points 362

Essayé le code suivant

 $db = new PDO("mysql:host={$dbhost};dbname={$dbname};charset=utf8", $dbuser, $dbpass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

Alors

 try {
 $db->query('SET NAMES gbk');
 $stmt = $db->prepare('SELECT * FROM 2_1_paidused WHERE NumberRenamed = ? LIMIT 1');
 $stmt->execute(array("\xbf\x27 OR 1=1 /*"));
 }
 catch (PDOException $e){
 echo "DataBase Errorz: " .$e->getMessage() .'<br>';
 }
 catch (Exception $e) {
 echo "General Errorz: ".$e->getMessage() .'<br>';
 }

Et a obtenu

DataBase Errorz: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/*' LIMIT 1' at line 1

Si ajoutées $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); après $db = ...

Ensuite eu de la page blanche

Si, au contraire, SELECT tenté DELETE, alors dans les deux cas d'erreur obtenu comme

 DataBase Errorz: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM 2_1_paidused WHERE NumberRenamed = '¿\' OR 1=1 /*' LIMIT 1' at line 1

Donc, ma conclusion qu'aucune injection possible...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X