如何防止 PostgreSQL JSON/JSONB 字段中的 SQL 注入?

How to prevent SQL Injection in PostgreSQL JSON/JSONB field?

How can I prevent SQL injection attacks in Go while using "database/sql"?

这解决了单值字段问题,因为您可以删除引号,但我无法过滤 JSON/JSONB 字段,如下所示,因为 </code> 被视为字符串:</p> <pre><code>`SELECT * FROM foo WHERE bar @> '{"baz": ""}'`

以下有效,但很容易 SQL 注入:

`SELECT * FROM foo WHERE bar @> '{"baz": "` + "qux" + `"}'`

我该如何解决这个问题?


在@mkopriva 的评论后编辑:

如何使用 jsonb_* 函数构建此 json [{"foo": }]?尝试了以下但没有成功:

jsonb_build_array(0, jsonb_build_object('foo', ::text))::jsonb

没有 sql 错误。过滤器不起作用。有一种方法可以检查构建的sql?我正在使用 database/sql 本机库。

这是您要找的吗?

type MyStruct struct {
    Baz string
}

func main() {
    db, err := sql.Open("postgres", "postgres://...")
    if err != nil {
        log.Panic(err)
    }

    s := MyStruct{
        Baz: "qux",
    }

    val, _ := json.Marshal(s)
    if err != nil {
        log.Panic(err)
    }

    if _, err := db.Exec("SELECT * FROM foo WHERE bar @> ?", val); err != nil {
        log.Panic(err)
    }
}

附带说明一下,Exec 不能用于检索(尽管我为您保留了它以便解决方案与您的示例匹配)。查看 db.Query(精彩教程在这里:http://go-database-sql.org/retrieving.html