关于动态表达式 Groovy SQL 的引用

Nic*_*ock 2 mysql postgresql groovy

我正在使用 Groovy 对我的数据库进行查询,查询运行良好并带回正确的数据,但是我在终端中收到此错误。

在 Groovy SQL 中,请不要在动态表达式(以 $ 开头)周围使用引号,因为这意味着我们不能使用 JDBC PreparedStatement,因此是一个安全漏洞。Groovy 已经解决了您的错误,但安全漏洞仍然存在。

这是我的查询

sql.firstRow("""select elem
                        from site_content,
                        lateral jsonb_array_elements(content->'playersContainer'->'series') elem
                        where elem @> '{"id": "${id}"}'
                     """)
Run Code Online (Sandbox Code Playgroud)

如果我将其更改为 $id 或

sql.firstRow("""select elem
                        from site_content,
                        lateral jsonb_array_elements(content->'playersContainer'->'series') elem
                        where elem @> '{"id": ?}'
                     """, id)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

org.postgresql.util.PSQLException:列索引超出范围:1,列数:0。

inj*_*eer 5

Positionalornamed参数由 groovy sql 正确处理,应使用而不是"'$id'".

正如@Opal 所提到的和此处所述,您应该将参数作为 alist或传递map

sql.execute "select * from tbl where a=? and b=?", [ 'aa', 'bb' ]
sql.execute "select * from tbl where a=:first and b=:last", first: 'aa', last: 'bb'
Run Code Online (Sandbox Code Playgroud)