gpt4 book ai didi

postgresql - 如何防止 PostgreSQL JSON/JSONB 字段中的 SQL 注入(inject)?

转载 作者:IT王子 更新时间:2023-10-29 01:40:39 31 4
gpt4 key购买 nike

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

这解决了单值字段问题,因为您可以删除引号,但我无法过滤 JSON/JSONB 字段,如下所示,因为 $1 被视为字符串:

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

以下是可行的,但它容易出现 SQL 注入(inject):

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

我该如何解决?


在@mkopriva 的评论后编辑:

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

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

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

最佳答案

这是您要找的吗?

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)

关于postgresql - 如何防止 PostgreSQL JSON/JSONB 字段中的 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54117802/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com