【发布时间】:2020-12-20 10:17:54
【问题描述】:
此查询是否会导致 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)
这里repo.getColumns() 是一个返回用户列 字符串的方法,setValues() 是一个字符串操作,用于从方法@ 上用户列的长度创建$1、$2、... 987654324@
会不会有潜在的安全性??对 QueryRowContext 参数第二个也是如此......它是...interface{},如果我有很多列,我应该一一输入手册,这是为了让它更短吗?
【问题讨论】:
-
是的,存在 SQL 注入的可能性。然而,该漏洞的严重程度取决于插入到查询字符串中的数据的可信度。
-
如何正确编写查询?对于我的情况@mkopriva
标签: database go prepared-statement sql-injection