我想知道是否可以通过 Perl execute()
使用 do()
在单个 DBD::Oracle
或 DBI
调用中执行多个 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 注入(inject)攻击来衡量可能造成的损害。是的,我知道,无论这个问题的答案如何,仍然必须使用绑定(bind)值和可信输入等从根本上消除 SQL 注入(inject)的可能性。但问题仍然存在:是否有可能使 DBD::Oracle
执行多条语句?
作为一个相关的例子,DBD::mysql
有一个 mysql_multi_statements
连接选项,它明确地启用了这个“特性”。我无法摆脱这样一种感觉,即有一些类似的、可能未记录且晦涩难懂的 Oracle OCI 选项可以通过 DBD::Oracle
以某种方式访问,这将实现相同的功能。
如果重要的话,这是:
perl
5.8.8DBD::甲骨文
1.22- 甲骨文 11g (11.01.0700)
请您参考如下方法:
如果 SQL 注入(inject)攻击成功,攻击者难道不能简单地重复它并以这种方式运行多个语句吗?
Oracle 支持可以包含多个语句的匿名 PL/SQL block 。
“开始立即执行‘drop table customers’;立即执行‘drop table sales’;结束”
Oracle 在此处提供了避免 SQL 注入(inject)攻击的免费教程: http://st-curriculum.oracle.com/tutorial/SQLInjection/index.htm