如何防止PL/SQL中的SQL注入

如何防止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

我们有一些包需要解决一些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_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中的漏洞。