提问人:srx lnx 提问时间:9/1/2020 更新时间:9/3/2020 访问量:636
使用 fmt 防止 Go 中的 sql 注入。用于本机查询的 Sprintf
prevent sql injection in Go with fmt.Sprintf for native query
问:
此查询是否使SQL注入或查询插入语句不好
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)
这是一个返回用户列字符串的方法,是一个字符串操作,用于创建 $1、$2、....从方法上的用户列的长度来看,它会潜在安全吗?alos on the QueryRowContext 参数 second 等等......是的,如果我有很多列,我应该一个接一个地输入手动,这是为了让它更短吗?repo.getColumns()
setValues()
getColumns()
...interface{}
答:
-1赞
Valentin Krasontovitsch
9/3/2020
#1
sql 注入攻击的可能性在于函数调用和 返回的值。repo.getColumns()
repo.setValues()
问题是你对这些函数返回的内容有多少控制权?他们的行为是否基于用户输入?如果是这样,那么你可以通过做一些简单的模式缓存来保护自己免受注入攻击 - 例如,如果你需要一个名称,请检查输入是否只由字母和空格组成。
还可以尝试排除任何可用于注入攻击且不应作为值列名称一部分的特殊符号。
...如果我有很多列,我应该一个接一个地输入手动,这是为了让它更短吗?
我建议就此单独提出一个问题,因为这是一个独特的问题。
评论