使用groovy.sql生成WHERE-IN()

使用groovy.sql生成WHERE-IN(),groovy,Groovy,有没有办法让Groovy的SQL库生成一个WHERE。。。在()中也可以防止SQL注入 我尝试了以下方法(其中stateList是一个列表或字符串[]-我尝试了这两种方法): 查询是,其中p.state位于(昆士兰,新南威尔士州)-字符串不带引号 WHERE p.state IN (${stateList.join(','}) WHERE p.state IN (${stateList}) 查询是,其中p.state位于(昆士兰,新南威尔士州)-字符串不带引号 WHERE p.state I

有没有办法让Groovy的SQL库生成一个WHERE。。。在()中也可以防止SQL注入

我尝试了以下方法(其中stateList是一个列表或字符串[]-我尝试了这两种方法):

查询是
,其中p.state位于(昆士兰,新南威尔士州)
-字符串不带引号

WHERE p.state IN (${stateList.join(','})
WHERE p.state IN (${stateList})
查询是
,其中p.state位于(昆士兰,新南威尔士州)
-字符串不带引号

WHERE p.state IN (${stateList.join(','})
WHERE p.state IN (${stateList})

查询是
其中p.state位于('QLD','NSW')
-字符串被引用,但我可以通过stateList注入SQL

这实际上取决于如何使用此字符串,我假设您正在使用

在这种情况下,应使用“?”填充查询,并在查询执行期间使用附加参数

文档中包含一个关于SQL注入的明确段落(在我在上面添加的链接中搜索“避免SQL注入”,因为它不提供锚链接)

因此,在这种情况下,它将类似于:

sql.firstRow("SELECT * from SOME_TABLE where state in '?','?'", [QLD, NSW])
这既避免了SQL注入,因为它在引擎盖下使用了
PreparedStatement
(与
Statement
)相反,而且性能更好,因为每次调用DB时,DB都可以避免查询解析(查询编译)

有时,使用命名参数可能更方便(见第4.5节),但简而言之,我认为在引擎盖下使用相同的技术:

sql.execute "INSERT INTO Person (firstname, lastname) VALUES (:first, :last)", first: 'John', last: 'Smith'
或:


作为后续工作,我最终实现了这一点,但我不得不使用有序参数列表,而不是命名参数的映射-我正在使用Groovy 2.4.15和H2 1.4.196,命名参数一直为空-可能是数据库驱动程序中的错误?嗯,可能有很多问题,我很久没有接触Groovy了,但基本上,这可能与你所做的语法有关。。。无论如何,我认为最好是用代码片段问另一个问题,你的代码到底是什么样子的,请随意在这里添加一个新问题的链接,这样我就可以得到通知并查看它。