我正在尝试在 postgres 中创建一个用户。目前正在尝试使用https://github.com/jackc/pgx作为连接到数据库的驱动程序。我有以下package mainimport ( "context" "fmt" "os" "github.com/jackc/pgx/v4")func main() { ctx := context.Background() conn, err := pgx.Connect(ctx, "host=localhost port=5432 user=postgres password=postgres dbname=postgres") if err != nil { panic(err) } defer conn.Close(ctx) // create user _, err = conn.Exec(ctx, "CREATE USER $1 WITH PASSWORD $2", "moulick", "testpass") if err != nil { fmt.Println(err) os.Exit(1) }}但我明白了ERROR: syntax error at or near "$1" (SQLSTATE 42601)我不明白这里有什么问题?
1 回答
Smart猫小萌
TA贡献1911条经验 获得超7个赞
我不明白这里有什么问题?” - 问题是位置参数只能用于值,不能用于标识符。
位置参数引用用于指示从外部提供给 SQL 语句的值。
您不能像CREATE USER <user_name>不能在SELECT t.<column_name> FROM <table_name> AS t.
user_name := "moulick"
_, err = conn.Exec(ctx, "CREATE USER "+user_name+" WITH PASSWORD $1", "testpass")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
如果user_name不是硬编码,而是来自未知的用户输入,您需要自己验证它以避免 SQL 注入的可能性。这不是一项艰巨的任务,因为标识符的词汇结构仅限于一小组规则,如果您愿意,您可以进一步减少到更小的子集(例如,不允许变音符号和非拉丁字母):
SQL 标识符和关键字必须以字母(az,还有带变音符号的字母和非拉丁字母)或下划线 (_) 开头。标识符或关键字中的后续字符可以是字母、下划线、数字 (0-9) 或美元符号 ($)。请注意,根据 SQL 标准的规定,标识符中不允许使用美元符号,因此使用它们可能会降低应用程序的可移植性。SQL 标准不会定义包含数字或以下划线开头或结尾的关键字,因此这种形式的标识符是安全的,不会与标准的未来扩展发生冲突。
- 1 回答
- 0 关注
- 73 浏览
添加回答
举报
0/150
提交
取消