我正在调查一些COBOL代码中可能存在的SQL注入错误。代码使用主机变量将语句提交到DB2数据库。例如:
EXEC SQL INSERT INTO TBL (a, b, c) VALUES (:x, :y, :z) END-EXEC谁能告诉我这个方法是否容易受到SQLi的攻击,或者COBOL/DB2解析主机变量的方式是否意味着它不可能执行?
我读到的每一件事都表明有更好的方法来防御SQLi,但IBM网站确实提到了使用主机变量,但没有解释它是否能完全缓解这种攻击。
发布于 2014-03-03 22:09:18
带有主机变量的静态语句不容易受到SQL注入攻击。
您需要担心的是非参数化的动态语句...它们看起来像这样:(我的COBOL是生锈的)
STRING "INSERT INTO TBL (a,b,c) VALUES ("
X ", "
Y ", "
Z ")" INTO WSQLSTMT.
EXEC SQL PREPARE MYSTMT FROM :WSQLSTMT END-EXEC.
EXEC SQL EXECUTE MYSTMT END-EXEC.请注意,您可以使用EXECUTE IMMEDIATE来代替准备和执行这两个步骤
相比之下,参数化的动态查询如下所示:
STRING "INSERT INTO TBL (a,b,c) VALUES (?, ?, ?)" INTO WSQLSTMT.
EXEC SQL PREPARE MYSTMT FROM :WSQLSTMT END-EXEC.
EXEC SQL EXECUTE MYSTMT USING :X, :Y, :Z END-EXEC.总之,带有主机变量的静态查询和参数化的动态查询一样安全。直接使用用户输入生成要执行的SQL语句的非参数化查询是不安全的。
要理解的关键是,在变量的运行时值生效之前,必须提前编译(准备)语句。在原始静态语句中,语句是在编译时自动准备的。
附注,因为静态语句是在编译时准备的,所以它比在运行时准备的动态语句执行得更好。因此,尽可能使用静态语句通常是最好的。
https://stackoverflow.com/questions/22147257
复制相似问题