首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用groovy.sql生成WHERE IN ()

问使用groovy.sql生成WHERE IN ()
EN

Stack Overflow用户
提问于 2021-03-10 12:11:03
回答 1查看 59关注 0票数 0

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

我尝试过以下方法(其中stateList是一个列表或一个String[] -我两者都尝试过):

代码语言:javascript
复制
WHERE p.state IN (${stateList})

查询为WHERE p.state in (QLD, NSW) -字符串不带引号

代码语言:javascript
复制
WHERE p.state IN (${stateList.join(','})

查询为WHERE p.state in (QLD, NSW) -字符串不带引号

代码语言:javascript
复制
WHERE p.state IN (${stateList})

查询是SQL -字符串是带引号的,但我可以通过stateList注入WHERE p.state in ('QLD', 'NSW')。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-10 12:39:34

这真的取决于如何使用这个字符串,我假设您使用的是Groovy SQL

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

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

因此,在本例中,它将类似于:

代码语言:javascript
复制
sql.firstRow("SELECT * from SOME_TABLE where state in '?','?'", [QLD, NSW])

这既避免了SQL注入,因为它在幕后使用了PreparedStatement (而不是Statement),而且在性能方面也更好,因为每次调用DB时,DB都可以避免查询解析(查询编译)。

有时使用命名参数可能更方便(参见4.5节here),但简而言之,我相信这是隐藏在幕后的相同技术:

代码语言:javascript
复制
sql.execute "INSERT INTO Person (firstname, lastname) VALUES (:first, :last)", first: 'John', last: 'Smith'

或者:

代码语言:javascript
复制
sql.execute "INSERT INTO Person (firstname, lastname) VALUES (?.first, ?.last)", first: 'John', last: 'Smith'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66558256

复制
相关文章

相似问题

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