【发布时间】:2023-03-18 21:40:01
【问题描述】:
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 发表评论后编辑:
如何使用 jsonb_* 函数构建这个 json [{"foo": $1}]?尝试以下但没有成功:
jsonb_build_array(0, jsonb_build_object('foo', $1::text))::jsonb
没有 sql 错误。过滤器只是不起作用。有一种方法可以检查构建的 sql 吗?我正在使用 database/sql 原生库。
【问题讨论】:
-
通过使用
json_build_object/jsonb_build_object和类似的函数而不是从字符串构造json。例如。... bar @> json_build_object("bar", $1) -
Go 中没有准备好的语句吗?这才是避免SQL注入的王道。
-
去掉
jsonb_build_array开头的0,;你正在创建[0, {"foo": …}]。此外,无需将jsonb_build_array转换为jsonb。
标签: postgresql go sql-injection