提问人:Dips 提问时间:10/26/2020 更新时间:10/29/2020 访问量:859
如何防止 PL/SQL 中的 SQL 注入
How to prevent SQL Injection in PL/SQL
问:
我们有一些软件包需要解决一些 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;
答:
1赞
Jon Heller
10/26/2020
#1
我没有看到您的代码有任何 SQL 注入问题 - 没有动态代码可以评估用户输入并退出预期的代码流。除非您的代码片段是在其他地方生成的,或者其中一个列名确实是调用动态 SQL 的函数,否则您的代码看起来很安全。
您使用了短语“清理输入”,这对数据库编程来说是一个糟糕的建议。尽管我很喜欢漫画 XKCD,但兰德尔弄错了这个。
绑定变量是避免 SQL 注入的最佳解决方案。我会借此机会(糟糕地)改变他的漫画:
评论
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 中的错误。
评论