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

时间:2019-01-09 20:25:01

标签: postgresql go sql-injection

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

这可以解决单值字段问题,因为您可以删除引号,但是我不能过滤JSON / JSONB字段,就像下面这样,因为$1被认为是字符串:

`SELECT * FROM foo WHERE bar @> '{"baz": "$1"}'`

以下方法可行,但易于进行SQL注入:

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

我该如何解决?


在@mkopriva评论后编辑:

如何使用[{"foo": $1}]函数构建此json jsonb_*?尝试以下操作未成功:

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

没有sql错误。筛选器不起作用。有一种方法可以检查生成的sql?我正在使用database/sql本机库。

1 个答案:

答案 0 :(得分:2)

这是您要找的吗?

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