有没有办法让Groovy的SQL库生成一个WHERE ...在()中也可以防止SQL注入吗?
我尝试过以下方法(其中stateList是一个列表或一个String[] -我两者都尝试过):
WHERE p.state IN (${stateList})查询为WHERE p.state in (QLD, NSW) -字符串不带引号
WHERE p.state IN (${stateList.join(','})查询为WHERE p.state in (QLD, NSW) -字符串不带引号
WHERE p.state IN (${stateList})查询是SQL -字符串是带引号的,但我可以通过stateList注入WHERE p.state in ('QLD', 'NSW')。
发布于 2021-03-10 12:39:34
这真的取决于如何使用这个字符串,我假设您使用的是Groovy SQL
在这种情况下,您应该用“?”填充查询。并在查询执行期间使用附加参数。
文档中包含一个关于SQL注入的明确段落(在上面添加的链接中搜索“避免SQL注入”,因为它不提供锚点链接)
因此,在本例中,它将类似于:
sql.firstRow("SELECT * from SOME_TABLE where state in '?','?'", [QLD, NSW])这既避免了SQL注入,因为它在幕后使用了PreparedStatement (而不是Statement),而且在性能方面也更好,因为每次调用DB时,DB都可以避免查询解析(查询编译)。
有时使用命名参数可能更方便(参见4.5节here),但简而言之,我相信这是隐藏在幕后的相同技术:
sql.execute "INSERT INTO Person (firstname, lastname) VALUES (:first, :last)", first: 'John', last: 'Smith'或者:
sql.execute "INSERT INTO Person (firstname, lastname) VALUES (?.first, ?.last)", first: 'John', last: 'Smith'https://stackoverflow.com/questions/66558256
复制相似问题