如何防止 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)
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)