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

How to prevent SQL Injection in PL/SQL

提问人:Dips 提问时间:10/26/2020 更新时间:10/29/2020 访问量:859

问:

我们有一些软件包需要解决一些 SQL 注入问题。我需要一些帮助来重写sql语句或清理输入。下面是 veracode 抛出错误的行号。

开放式c_ccl(p_part_nr,p_ctry_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 预言机 PLSQLSQL 注入

评论

2赞 Erich Kitzmueller 10/26/2020
对我来说,看起来不像 SQL 注入易受影响的代码。
1赞 Andrew Sayer 10/26/2020
我也没有看到任何SQL注入,但您的错误处理是一场等待发生的噩梦。你真的不在乎任何可能引发的错误吗?您可能希望忽略一些错误,但不是全部,应该提出您无法处理的错误。您还希望确保在发生错误时关闭光标 - 当其他人没有异常时,默认行为会为您执行此操作。
0赞 Wernfried Domscheit 10/26/2020
编写函数的方式正是防止任何 SQL 注入的方法。你的问题是什么?

答:

1赞 Jon Heller 10/26/2020 #1

我没有看到您的代码有任何 SQL 注入问题 - 没有动态代码可以评估用户输入并退出预期的代码流。除非您的代码片段是在其他地方生成的,或者其中一个列名确实是调用动态 SQL 的函数,否则您的代码看起来很安全。

您使用了短语“清理输入”,这对数据库编程来说是一个糟糕的建议。尽管我很喜欢漫画 XKCD,但兰德尔弄错了这个。

绑定变量是避免 SQL 注入的最佳解决方案。我会借此机会(糟糕地)改变他的漫画:

enter image description here

评论

0赞 Dips 10/26/2020
嗨,我可以理解,但我再次使用veracode软件进行扫描,它在下一行中显示sql注入错误。开放式c_ccl(p_part_nr,p_ctry_cd);是否有可能因为变量传递给游标?
1赞 Erich Kitzmueller 10/27/2020
显然,veracode是错误的。让这样的工具感到高兴可能是一个巨大的痛苦,而实际上你的代码根本没有问题。你能做的最好的事情就是向veracode的开发人员提交一个错误报告。也许他们可以解释为什么 veracode 在没有漏洞的情况下显示漏洞,并且运气好的话,您可以使用特殊注释或左右将代码标记为安全,以解决 veracode 中的错误。