2014-03-03 120 views
2

我正在调查一些COBOL代码中可能的SQL注入漏洞。该代码使用主机变量将语句提交给DB2数据库。例如COBOL/DB2 SQL注入

EXEC SQL INSERT INTO TBL (a, b, c) VALUES (:x, :y, :z) END-EXEC 

谁能告诉我,如果这个方法是容易受到攻击SQLI或者如果方式COBOL/DB2解析主机变量意味着,这将是不可能的执行?

我读到的每件事情都表明,有更好的方法来防范SQLi,但IBM网站确实提到了使用主机变量,但没有说明它是否会完全缓解攻击。

回答

4

具有主机变量的静态语句不容易受到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,到位两个步骤的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. 

总之,为static使用像你这样的主机变量进行查询的原始发布是安全的,因为它是一个参数化的动态查询。直接使用用户输入构建要执行的SQL语句的非参数化查询不安全。

要理解的关键是在变量的运行时间值发挥作用之前,语句必须事先编译(准备好)。在你最初的静态语句中,语句是在编译时自动准备的。

注意,由于静态语句是在编译时准备的,因此它比在运行时准备的动态语句更好。因此,尽可能使用静态语句通常是最好的。

+0

非常感谢。只是要更加确定 - :x,:y和:z会是动态的,因为它们来自用户输入。所以只想检查一下主机变量中的值是否会影响查询,例如通过包含引号和注释字符。 – user3374881

+1

否 - 动态SQL是在将字符串传递给数据库之前连接字符串的位置。如果_those_连接的字符串包含用户输入,那么就搞砸了。 (好吧,有一些“安全”类型或方式可以引用其他类型,但通常使用参数/主机变量会更好/更容易)。 –