可用版本:Dev (3.21) | 最新版 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

SQL注入

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

SQL 注入非常严重

SQL 注入是一个需要彻底解决的严重问题。一个漏洞就足以让攻击者转储整个数据库,并可能控制您的数据库服务器。 我们已经在 jOOQ 博客上撰写了有关此威胁严重性的文章

SQL 注入的发生是因为编程语言 (SQL) 用于基于用户输入动态创建任意服务器端语句。程序员必须非常小心,不要将语言部分 (SQL) 与用户输入(绑定变量)混合。

jOOQ 中的 SQL 注入

使用 jOOQ 时,SQL 通常通过类型安全、非动态的 Java 抽象语法树创建,其中绑定变量是该抽象语法树的一部分。不可能通过这种方式暴露 SQL 注入漏洞。

但是,jOOQ 提供了方便的方法来在 jOOQ API 的各个位置引入纯 SQL 字符串(自 jOOQ 3.6 以来,这些位置使用org.jooq.PlainSQL注释)。虽然 jOOQ 的 API 允许您指定用于纯 SQL 的绑定值,但您并非必须这样做。例如,以下两个查询将导致相同且有效的结果

// This query will use bind values, internally.
create.fetch("SELECT * FROM BOOK WHERE ID = ? AND TITLE = ?", 5, "Animal Farm");

// This query will not use bind values, internally.
create.fetch("SELECT * FROM BOOK WHERE ID = 5 AND TITLE = 'Animal Farm'");

jOOQ API 中所有允许使用纯(未转义、未经处理)SQL 的方法都在其相关的 Javadoc 中包含警告消息,以提醒您在原本是 SQL 注入安全的 API 中存在 SQL 注入的风险。

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo