COBOL/DB2SQL注入

COBOL/DB2SQL注入,db2,sql-injection,cobol,Db2,Sql Injection,Cobol,我正在调查一些COBOL代码中可能存在的SQL注入错误。代码使用主机变量将语句提交到DB2数据库。e、 g EXEC SQL INSERT INTO TBL (a, b, c) VALUES (:x, :y, :z) END-EXEC 有人能告诉我这个方法是否容易受到SQLi攻击,或者COBOL/DB2解析主机变量的方式是否意味着它将无法执行 我读到的每一件事都表明有更好的方法来防范SQLi,但IBM网站确实提到使用主机变量,但没有解释它是否能够完全抵御攻击。带有主机变量的静态语句不易受到SQ

我正在调查一些COBOL代码中可能存在的SQL注入错误。代码使用主机变量将语句提交到DB2数据库。e、 g

EXEC SQL INSERT INTO TBL (a, b, c) VALUES (:x, :y, :z) END-EXEC
有人能告诉我这个方法是否容易受到SQLi攻击,或者COBOL/DB2解析主机变量的方式是否意味着它将无法执行


我读到的每一件事都表明有更好的方法来防范SQLi,但IBM网站确实提到使用主机变量,但没有解释它是否能够完全抵御攻击。

带有主机变量的静态语句不易受到SQL注入攻击

您需要担心的是非参数化动态语句。。。 它们看起来是这样的:(我的COBOL生锈了)

注意,您可以使用executeimmediate来代替两个步骤PREPARE和EXECUTE

与此相反,参数化动态查询如下所示:

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.
总之,与参数化动态查询一样,使用原始POST等主机变量的静态查询是安全的。直接使用用户输入构建要执行的SQL语句的非参数化查询是不安全的

要理解的关键是,在变量的运行时值发挥作用之前,必须提前编译(准备)语句。在原始静态语句中,该语句在编译时自动准备


旁注,由于静态语句是在编译时准备的,所以它的性能比在运行时准备的动态语句要好。因此,只要可能,通常最好使用静态语句

非常感谢。更确切地说-:x、:y和:z是动态的,因为它们来自用户输入。因此,我们只想检查主机变量中的值是否不会影响查询,例如,通过包含引号和注释字符。非动态SQL是在将字符串传递到数据库之前连接字符串的地方。如果这些串接的字符串包含用户输入,你就完蛋了。(当然,有一些“安全”类型或方法可以引用其他类型,但使用参数/主机变量通常更好/更容易)。
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.