我正在使用Groovy SQL执行一个查询,该查询将一些JSON添加到Postgres JSONB数据库中的数组中。
当我运行下面的代码时,我收到有关SQL注入的警告,我得到的警告在下面。
在Groovy SQL中,请不要在动态表达式周围使用引号 (以$开头)因为这意味着我们不能使用JDBC PreparedStatement等是一个安全漏洞。 Groovy一直在努力 你的错误,但安全漏洞仍在那里。
如果我的JSON中有一个'字符,我也无法在我的数据库中保存JSON,我收到以下错误:
Sql无法处理查询未终止的'character
@Override
Operation save(Player player) {
String json = objectMapper.writeValueAsString(player)
Blocking.get {
sql.executeUpdate("""
UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'players' || '${json}'::jsonb)
where id = :id
""",id: player.teamId)
}.operation()
}
我已将代码更改为此
@Override
Operation save(Player player) {
String json = objectMapper.writeValueAsString(player)
Blocking.get {
sql.executeUpdate("""
UPDATE site_content
SET content = jsonb_set(content, '{playersContainer,players}'::text[], content->'playersContainer'->'players' || ':json'::jsonb)
where id = :id
""", json: json, id: player.teamId)
}.operation()
}
但是我收到了错误
详细信息:预期的JSON值,但找到“:”。位置:167
将动态参数放入Groovy SQL查询的正确方法是什么?我应该在将JSON发送到查询时对其进行编码吗?在我从我的React应用程序发送它之前的那一刻,我做JSON.stringfy(json)这还不够吗?
答案 0 :(得分:1)
绑定名称周围不得有引号。
使用:json
代替':json'
。
第一个是绑定,第二个是以冒号开头的字符串。因此,错误消息很简单:无法从字符串':json'
解析json对象。