Je sais que PDO ne prend pas en charge plusieurs requêtes exécutées dans une seule instruction. J'ai cherché sur Google et j'ai trouvé quelques articles parlant de PDO_MYSQL et PDO_MYSQLND.
PDO_MySQL est une application plus dangereuse que toute autre application MySQL traditionnelle. MySQL traditionnel n'autorise qu'une seule requête SQL. Dans PDO_MySQL, il n'y a pas de telle limitation, mais vous risquez d'être injecté avec plusieurs requêtes.
De: Protection contre l'injection SQL à l'aide de PDO et Zend Framework (juin 2010; par Julian)
Il semble que PDO_MYSQL et PDO_MYSQLND prennent en charge plusieurs requêtes, mais je ne peux pas trouver plus d'informations à leur sujet. Ces projets ont-ils été abandonnés? Existe-t-il maintenant un moyen d'exécuter plusieurs requêtes à l'aide de PDO.
Réponses:
Comme je le sais,
PDO_MYSQLND
remplacéPDO_MYSQL
dans PHP 5.3. Une partie déroutante est que le nom est toujoursPDO_MYSQL
. Alors maintenant, ND est le pilote par défaut pour MySQL + PDO.Dans l'ensemble, pour exécuter plusieurs requêtes à la fois, vous avez besoin:
PDO::ATTR_EMULATE_PREPARES
est défini sur1
(par défaut). Vous pouvez également éviter d'utiliser des instructions préparées et les utiliser$pdo->exec
directement.Utiliser exec
Utiliser des déclarations
Une note:
Lorsque vous utilisez des instructions préparées émulées, assurez-vous que vous avez défini un codage approprié (qui reflète le codage réel des données) dans DSN (disponible depuis 5.3.6). Sinon, il peut y avoir une légère possibilité d'injection SQL si un encodage étrange est utilisé .
la source
Après une demi-journée à tripoter cela, j'ai découvert que PDO avait un bug où ...
-
-
-
Il exécuterait le
"valid-stmt1;"
, s'arrêterait"non-sense;"
et ne générerait jamais d'erreur. Ne fonctionnera pas"valid-stmt3;"
, retournera vrai et mentira que tout s'est bien passé.Je m'attendrais à ce qu'il se trompe sur le
"non-sense;"
mais ce n'est pas le cas.Voici où j'ai trouvé cette information: La requête PDO invalide ne renvoie pas d'erreur
Voici le bug: https://bugs.php.net/bug.php?id=61613
Donc, j'ai essayé de le faire avec mysqli et je n'ai pas vraiment trouvé de réponse solide sur son fonctionnement, alors j'ai pensé que je le laisserais ici pour ceux qui veulent l'utiliser.
la source
$pdo->exec("valid-stmt1; non-sense; valid-stmt3;");
sans les deux précédents exécutifs? Je peux l'amener à lancer des erreurs au milieu, mais pas lorsqu'il est exécuté après des exécutifs réussis .$pdo->exec("")
sont indépendants les uns des autres. Je les ai maintenant divisés pour indiquer qu'ils n'ont pas besoin d'être dans un ordre pour que le problème se pose. Ces 3 sont 3 configurations d'exécution de plusieurs requêtes dans une seule instruction exec.exec
sur la page, mais si j'exécute plusieursexec
chacun avec plusieurs instructions SQL, alors je reproduis le même bogue ici. Mais si c'est le seulexec
sur la page, je ne peux pas le reproduire.exec
sur votre page contenait-il plusieurs déclarations?Une approche rapide et sale:
Se divise à des points de fin d'instruction SQL raisonnables. Il n'y a pas de contrôle d'erreur, pas de protection contre l'injection. Comprenez votre utilisation avant de l'utiliser. Personnellement, je l'utilise pour semer des fichiers de migration bruts pour les tests d'intégration.
la source
;
pauses si votre SQL contient des définitions de procédure ou de déclencheur ... raisons pour lesquelles ce n'est pas bon.Comme des milliers de personnes, je cherche cette question:
Peut exécuter plusieurs requêtes simultanément, et s'il y avait une erreur, aucune ne s'exécuterait Je suis allé sur cette page partout
Mais bien que les amis ici aient donné de bonnes réponses, ces réponses n'étaient pas bonnes pour mon problème
J'ai donc écrit une fonction qui fonctionne bien et qui n'a presque aucun problème avec SQL Injection.
Cela pourrait être utile pour ceux qui recherchent des questions similaires, je les mets ici pour les utiliser
à utiliser (exemple):
et ma connexion:
Remarque:
cette solution vous aide à exécuter plusieurs instructions ensemble.Si
une instruction incorrecte se produit, elle n'exécute aucune autre instruction
la source
Code suivant essayé
ensuite
Et j'ai
Si ajouté
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
après$db = ...
Puis j'ai une page blanche
Si à la place
SELECT
essayéDELETE
, alors dans les deux cas une erreur commeDonc ma conclusion qu'aucune injection n'est possible ...
la source
but you risk to be injected with multiple queries.
Ma réponse concerne l'injectionEssayez cette fonction: plusieurs requêtes et insertion de valeurs multiples.
la source
PDO le soutient (à partir de 2020). Faites simplement un appel query () sur un objet PDO comme d'habitude, en séparant les requêtes par; puis nextRowset () pour passer au résultat SELECT suivant, si vous en avez plusieurs. Les ensembles de résultats seront dans le même ordre que les requêtes. Pensez évidemment aux implications de sécurité - alors n'acceptez pas les requêtes fournies par l'utilisateur, utilisez les paramètres, etc. Je l'utilise avec des requêtes générées par code par exemple.
la source