COBOL/DB2 SQL注入

use*_*881 3 db2 cobol sql-injection

我正在研究一些COBOL代码中可能的SQL注入错误.该代码使用宿主变量将语句提交到DB2数据库.例如

EXEC SQL INSERT INTO TBL (a, b, c) VALUES (:x, :y, :z) END-EXEC
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我这个方法是否容易受到SQLi攻击,或者COBOL/DB2解析主机变量的方式意味着它是不可能执行的?

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

Cha*_*les 5

带有主机变量的静态语句不容易受到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.
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用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.
Run Code Online (Sandbox Code Playgroud)

总之,与原始发布的主变量一样的静态查询是SAFE,因为参数化动态查询.直接使用用户输入来构建要执行的SQL语句的非参数化查询是不安全的.

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

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