如何在Oracle SQLPlus中防止SQL注入?

时间:2009-02-23 20:11:51

标签: sql oracle batch-file sql-injection sqlplus

显然,如果我使用JDBC / ODBC,我可以使用绑定变量和预处理语句来防止SQL注入。但是,当数据传递给最终调用Oracle SQLPlus的批处理时,有没有办法阻止SQL注入?例如:

query.sql的:

select '&1' from dual;
exit;

如果我这样从SQLPlus调用这个脚本:

$ sqlplus SCOTT/TIGER @query.sql "x','y"

我将得到以下输出:

old   1: select '&1' from dual
new   1: select 'x','y' from dual

' '
- -
x y

如您所见,SQLPlus命令行参数使用简单的宏替换。有没有我想念的替代方法?否则,我该如何防止这种情况被利用?

5 个答案:

答案 0 :(得分:4)

通过命令行通过SQL * Plus传递参数将不仅仅是SQL注入,因为命令行将首先通过操作系统进行解释。因此,您还需要考虑操作系统用户可以做什么。

就个人而言,我会抛弃SQL * Plus并使用像Perl这样的东西。您可以使用适当的编程语言来包装SQL语句,并且可以更好地处理变量和异常。

答案 1 :(得分:4)

如果人们有sql * plus访问你的数据库,并且你有一个特权用户的用户ID和密码在这里用脚本供他们阅读,那你无论如何都要把裤子丢给他们。 SQL注入是您最不担心的事情。

答案 2 :(得分:0)

我建议使用绑定变量。在您的脚本中,您应该能够执行以下操作:

variable my_var varchar2(100);
begin
:my_var := &1;
end;
/
select :my_var from dual;

“my_var”变量将绑定到查询。

。而不是简单的查找/替换

答案 3 :(得分:-1)

除非您将SQL * Plus脚本暴露给互联网上的恶意陌生人,否则您无法真正拥有SQL注入攻击。实际上会攻击贵公司的人。

看来你在谈论内部批量作业;完全在防火墙后面,其他网络用户是你的同事,对吗?

除非他们是严重疯狂的反社会人士,否则“攻击”没有任何意义。确实出现的任何SQL注入问题都是非常糟糕的设计或终止原因。这只是对人们访问的普通管理以及他们使用可用工具的技能。


修改

虽然我不能假装知道“因控制字符造成的破损”的含义,但我可以提供一些额外的建议。

如果您怀疑自己可能遇到编程问题 - 通过SQL注入 - 会在运行时导致破坏,那么您需要一个测试环境。

克隆生产模式以生成测试模式。使用已知数据子集加载。在测试模式上运行SQL脚本。如果您“以某种方式”将“控制字符”放入SQL脚本中,那么您将拥有一个演示此内容的测试脚本。

答案 4 :(得分:-2)

您可以使用以下SQL Plus命令:

SET DEFINE OFF