在Groovy SQL中使用参数的正确方法

时间:2017-02-23 08:25:34

标签: mysql json groovy

我正在使用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)这还不够吗?

1 个答案:

答案 0 :(得分:1)

绑定名称周围不得有引号。

使用:json代替':json'

第一个是绑定,第二个是以冒号开头的字符串。因此,错误消息很简单:无法从字符串':json'解析json对象。