是否可以使用DBD :: Oracle在单个查询中执行多个语句?

时间:2009-06-03 16:04:54

标签: perl oracle security sql-injection dbi

我想知道是否可以通过Perl execute()使用do()在单个DBD::OracleDBI调用中执行多个SQL语句。例如:

# 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);

我问这不是因为我想要真正做这样的事情,而是因为我想通过成功的SQL注入攻击来衡量可能造成的损害。是的,我知道,无论这个问题的答案如何,SQL注入的可能性仍然必须在其根目录中使用绑定值和可信输入等来消除。但问题仍然存在:是否有可能使{{{ 1}}执行多个语句?

作为一个相关示例,DBD::mysql具有mysql_multi_statements连接选项,可明确启用此“功能”。我不能动摇这种感觉,即有一些类似的,可能没有文档记录且模糊不清的Oracle OCI选项,可通过DBD::Oracle以某种方式访问​​,从而实现同样的目的。

如果重要,那就是:

  • DBD::Oracle 5.8.8
  • perl 1.22
  • Oracle 11g(11.01.0700)

1 个答案:

答案 0 :(得分:7)

如果SQL注入攻击成功,攻击者是否只能重复它并以这种方式运行多个语句?

Oracle支持可以包含多个语句的匿名PL / SQL块。

“立即执行'drop table customers';立即执行'drop table sales';结束”

Oracle提供了一个免费的SQL注入攻击教程: http://st-curriculum.oracle.com/tutorial/SQLInjection/index.htm