gpt4 book ai didi

database - 使用 fmt.Sprintf 防止 Go 中的 sql 注入(inject)进行 native 查询

转载 作者:行者123 更新时间:2023-12-01 22:35:36 25 4
gpt4 key购买 nike

这个查询是进行 sql 注入(inject)还是对查询插入语句不利

    query := fmt.Sprintf("INSERT INTO users(%s) VALUES(%s) RETURNING user_id, otp",
repo.getColumns(), // returning users columns
repo.setValues(), // looping to create $1, $2 (depent length of users columns)
)
stmt, err := db.Prepare(query)
checkError(err)
defer func() {
if err = stmt.Close(); err != nil {
panic(err.Error())
}
}()
err = stmt.QueryRowContext(ctx,
user.Email,
user.CardID,
user.CardFee,
user.PhoneNumber,
user.Gender,
user.BirthDate,
user.BirthCityID,
user.Education,
user.MotherName,
user.MotherPhone,
user.PartnerPhone,
user.FamilyCardNumber,
user.Religion,
user.CitizenShip,
user.MaritalStatus,
user.SpouseCardID,
user.SpouseFullName,
user.SpouseBirthDate,
).Scan(&userData.ID, &userData.CardID)

这里 repo.getColumns()是返回字符串 的方法用户专栏 setValues()是一个字符串操作,用于从方法 getColumns() 上的用户列的长度创建 $1, $2, ....
会不会有潜在的安全性??在第二个 QueryRowContext 参数上也是如此......它是 ...interface{}如果我有很多列,我应该一一输入手册,这是为了让它更短吗?

最佳答案

sql 注入(inject)攻击的可能性在于函数调用返回的值 repo.getColumns()repo.setValues() .
问题是您对这些函数返回的内容有多少控制权?他们的行为是否基于用户输入?如果是这样,那么您可以通过一些简单的模式处理来保护自己免受注入(inject)攻击 - 例如,如果您需要一个名称,请检查输入是否仅包含字母和空格。
您还可以尝试排除任何可用于注入(inject)攻击且不应作为值列名称的一部分的特殊符号。

... if i have a lot of columns, i shoudl input manual one by one, is that something to make it shorter ?


我建议就此提出一个单独的问题,因为这是一个明显的问题。

关于database - 使用 fmt.Sprintf 防止 Go 中的 sql 注入(inject)进行 native 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63685307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com