如何防止PL/SQL中的SQL注入
我们有一些包需要解决一些SQL注入问题。我需要一些帮助来重写sql语句或清理输入。下面是veracode抛出错误的行号 打开c_ccl(零件号、零件号和cd) //源代码如何防止PL/SQL中的SQL注入,sql,oracle,plsql,sql-injection,Sql,Oracle,Plsql,Sql Injection,我们有一些包需要解决一些SQL注入问题。我需要一些帮助来重写sql语句或清理输入。下面是veracode抛出错误的行号 打开c_ccl(零件号、零件号和cd) //源代码 CREATE OR REPLACE EDITIONABLE PACKAGE BODY "schema"."Test_PKG" AS v_data t_cla_class_data; FUNCTION nat_eccn_cd( p_part_nr IN t_p
CREATE OR REPLACE EDITIONABLE PACKAGE BODY "schema"."Test_PKG" AS
v_data t_cla_class_data;
FUNCTION nat_eccn_cd( p_part_nr IN t_part_nr, p_ctry_cd IN t_ctry_cd )
RETURN t_us_eccn_cd IS
CURSOR c_ccl(p_part_nr CHAR, p_ctry_cd CHAR) IS
SELECT NAT_CCL_CD FROM CLSDBA.CLA_EXP_PART_CTRY e
WHERE e.PART_NR = p_part_nr AND e.CTRY_CD = p_ctry_cd
ORDER BY e.VAL_FROM_DT DESC;
v_ctry_cd char(4) := p_ctry_cd;
v_trf_cd char(4);
BEGIN
v_data.nat_eccn_cd := NULL;
open c_ccl (p_part_nr,p_ctry_cd);
fetch c_ccl INTO v_data.nat_eccn_cd;
close c_ccl;
return (trim(v_data.nat_eccn_cd));
exception when others then return NULL;
end;
我看不到您的代码有任何SQL注入问题-没有动态代码可以评估用户输入并从预期的代码流中退出。除非您的代码段是在其他地方生成的,或者其中一个列名实际上是调用动态SQL的函数,否则您的代码看起来是安全的 您使用了短语“清理输入”,这对于数据库编程来说是一个糟糕的建议。尽管我很喜欢这部连环漫画,Randall还是搞错了 绑定变量是避免SQL注入的最佳解决方案。我将借此机会(糟糕地)改变他的漫画:
在我看来,SQL注入不易受影响。我也没有看到任何SQL注入,但您的错误处理是一场等待发生的噩梦。你真的不在乎任何可能引起的错误吗?您可能希望忽略一些错误,但不是全部,您无法处理的错误应该被提出。您还需要确保在发生错误时关闭游标,这是默认行为,即当其他人为您执行此操作时,不会出现异常。编写函数的方式正是防止任何SQL注入的方式。你们的问题是什么?嗨,我能理解,但我用veracode软件再次扫描,它在下面一行显示sql注入错误。打开c_ccl(零件号、零件号和cd);这可能是因为变量传递给游标吗?显然,veracode是错误的。当你的代码没有任何问题的时候,让这样一个工具开心起来可能是一件非常痛苦的事情。你能做的最好的事情就是向veracode的开发者提交一份bug报告。也许他们可以解释为什么veracode在没有漏洞的情况下会显示漏洞,幸运的是,你可以用一个特殊的注释或其他方式将代码标记为安全的,以解决veracode中的漏洞。