2009-06-03 5 views
1

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.8
  • DBD::Oracle 1,22
  • Oracle 11g (11.01.0700)

Répondre

7

S'il y a une injection SQL réussie attaque, l'attaquant ne pourrait-il pas simplement le répéter et exécuter plusieurs déclarations de cette façon?

Oracle prend en charge les blocs PL/SQL anonymes pouvant contenir plusieurs instructions.

"commencer à exécuter immédiatement 'clients drop table'; exécution 'des ventes de table de baisse de immédiat; fin"

Oracle fournit un tutoriel gratuit à éviter les attaques par injection SQL ici: http://st-curriculum.oracle.com/tutorial/SQLInjection/index.htm

+0

Le « BEGIN execute immédiate ... "technique a fait l'affaire. Merci! –

+0

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? –

+0

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

Questions connexes