首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COBOL/DB2SQL注入

COBOL/DB2SQL注入
EN

Stack Overflow用户
提问于 2014-03-03 20:48:55
回答 1查看 3.4K关注 0票数 3

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

代码语言:javascript
复制
EXEC SQL INSERT INTO TBL (a, b, c) VALUES (:x, :y, :z) END-EXEC

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-03-03 22:09:18

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

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

代码语言:javascript
复制
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来代替准备和执行这两个步骤

相比之下,参数化的动态查询如下所示:

代码语言:javascript
复制
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语句的非参数化查询是不安全的。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22147257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档