使用“數(shù)據(jù)庫/sql”時如何防止 Go 中的 SQL 注入攻擊?這解決了單值字段問題,因為您可以刪除引號,但我無法過濾 JSON/JSONB 字段,如下所示,因為 被$1視為字符串:`SELECT?*?FROM?foo?WHERE?bar?@>?'{"baz":?"$1"}'`以下是可行的,但它容易出現(xiàn) SQL 注入:`SELECT?*?FROM?foo?WHERE?bar?@>?'{"baz":?"`?+?"qux"?+?`"}'`我該如何解決這個問題?我將如何使用這些函數(shù)構(gòu)建這個[{"foo": $1}]json?jsonb_*?嘗試了以下但沒有成功:jsonb_build_array(0,?jsonb_build_object('foo',?$1::text))::jsonb沒有sql錯誤。過濾器不起作用。有一種方法可以檢查構(gòu)建的 sql 嗎?我正在使用database/sql本機庫。
1 回答

叮當貓咪
TA貢獻1776條經(jīng)驗 獲得超12個贊
這是你要找的嗎?
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
它不是用于檢索的(盡管我為您保留了它,因此解決方案將與您的示例相匹配)。
- 1 回答
- 0 關(guān)注
- 144 瀏覽
添加回答
舉報
0/150
提交
取消