gpt4 book ai didi

db2 - COBOL/DB2 SQL 注入(inject)

转载 作者:行者123 更新时间:2023-12-04 05:39:43 26 4
gpt4 key购买 nike

我正在调查某些 COBOL 代码中可能存在的 SQL 注入(inject)错误。该代码使用主机变量将语句提交给 DB2 数据库。例如

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

谁能告诉我这种方法是否容易受到 SQLi 攻击,或者 COBOL/DB2 解析主机变量的方式是否意味着它无法执行?

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

最佳答案

带有宿主变量的静态语句不易受到 SQL 注入(inject)攻击。

非参数化动态语句是您需要担心的...它们看起来像这样:(我的 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.

总而言之,像您最初发布的那样带有主机变量的静态查询和参数化动态查询一样是安全的。直接使用用户输入构建要执行的 SQL 语句的非参数化查询是不安全的。

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

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

关于db2 - COBOL/DB2 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22147257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com