如何解决使用fmt.Sprintf阻止Go中的SQL注入以进行本机查询
此查询是进行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()
是一种返回 users列的字符串的方法,而setValues()
是一种字符串操作,用于根据用户的长度创建$ 1,$ 2 ...方法getColumns()
的专栏
有潜在的安全性吗?其次在QueryRowContext参数上,等等....它是...interface{}
,如果我有很多列,我应该一一输入手册,是不是要使它更短一些?
解决方法
sql注入攻击的可能性在于函数调用repo.getColumns()
和repo.setValues()
返回的值。
问题是您对这些函数返回的内容有多少控制权?他们的行为是否基于用户输入?如果是这样,那么您可以例如通过执行一些简单的模式匹配来保护自己免受注入攻击-例如,如果您期望一个名称,请检查输入内容是否仅包含字母和空格。
您还可以尝试排除可用于注入攻击的特殊符号,这些特殊符号不应作为值的列名的一部分。
...如果我有很多专栏,我应该一本一本地输入手册,那是为了使其更短吗?
我建议对此单独询问,因为这是一个明显的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。