为了账号安全,请及时绑定邮箱和手机立即绑定

使用 pgx 在 postgres 中创建用户 (SQLSTATE 42601)

使用 pgx 在 postgres 中创建用户 (SQLSTATE 42601)

Go
德玛西亚99 2022-11-23 20:20:34
我正在尝试在 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 标准不会定义包含数字或以下划线开头或结尾的关键字,因此这种形式的标识符是安全的,不会与标准的未来扩展发生冲突。


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信