显然,如果我使用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命令行参数使用简单的宏替换。有没有我想念的替代方法?否则,我该如何防止这种情况被利用?
答案 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