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

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

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

Go
德玛西亚99 2022-11-23 20:20:34

我正在尝试在 postgres 中创建一个用户。目前正在尝试使用https://github.com/jackc/pgx作为连接到数据库的驱动程序。我有以下


package main


import (

    "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贡献1606条经验 获得超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

添加回答

举报

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