Je voudrais savoir s'il est possible d'exécuter plusieurs instructions SQL au sein d'un seul appel execute()
ou do()
en utilisant DBD::Oracle
via Perl DBI
. Exemple:Est-il possible d'exécuter plusieurs instructions dans une seule requête en utilisant DBD :: Oracle?
# Multiple SQL statements in a single query, separated by a ";"
$sql = 'UPDATE foo SET bar = 123; DELETE FROM foo WHERE baz = 456';
$sth = $dbh->prepare($sql);
$sth->execute;
# ...or...
$dbh->do($sql);
Je demande à ce pas parce que je veux vraiment faire une telle chose, mais plutôt parce que je veux évaluer les dégâts possibles grâce à une attaque réussie d'injection SQL. Et oui, je sais que, indépendamment de la réponse à cette question, la possibilité d'injection SQL doit toujours être éliminée à sa racine en utilisant des valeurs de liaison et de confiance, etc. Mais la question reste entière: est-il possible de faire DBD::Oracle
plusieurs déclarations?
En tant qu'exemple connexe, DBD::mysql
dispose d'une option de connexion mysql_multi_statements
qui active explicitement cette "fonctionnalité". Je ne peux pas oublier le sentiment qu'il existe une option Oracle OCI similaire, peut-être non documentée et obscure, qui est accessible d'une manière ou d'une autre via DBD::Oracle
qui permettra la même chose.
Dans le cas où il importe, c'est:
perl
5.8.8DBD::Oracle
1,22- Oracle 11g (11.01.0700)
Le « BEGIN execute immédiate ... "technique a fait l'affaire. Merci! –
Je suis toujours curieux d'une injection au milieu d'une déclaration, par exemple. "SELECT foo FROM bar Où baz = '$ x'" où $ x est "123 '; DROP TABLE abc" Est-ce que la technique "begin execute immediate" requiert toujours le contrôle de l'instruction depuis le début? –
En règle générale, le "BEGIN" doit être au début de la déclaration, mais il y a probablement un moyen de contourner le problème. Selon les paquets auxquels votre utilisateur a accès, ils peuvent appeler des paquets comme utl_http ou utl_file et faire de mauvaises choses. – Plasmer