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
本机库。
答案 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)