我有一个准备和查询功能,当我放置?在搜索中它工作正常。当我尝试使用%I进行包含搜索时,我会sql: statement expects 0 inputs; got 1
如何在不直接在SQL中使用变量的情况下执行此类查询?我想阻止SQL注入。谢谢你的帮助。
我正在使用go版本go1.8.1 darwin / amd64并使用MySQL
我的Go Code:
stmt, err := dBusers.Prepare("SELECT id, name, email, username FROM users WHERE name LIKE '%?%';")
if err != nil {
logging.LogError("Could Not Query All Users: "+err.Error())
return nil, errors.New("Could Not Query Users")
}
rows, err := stmt.Query(name)
答案 0 :(得分:2)
将我的评论作为答案重新发布,以便这个问题实际上有一个:
This answer建议使您的参数参数(在本例中为name
)包含通配符而不是查询。所以stmt.Query("%" + name + "%")
。这仍然可以防止注入,因为它仍然作为参数发送而不是与查询内联。
答案 1 :(得分:0)
您可以将整个%searchValue%本身设为参数值,也可以在查询本身内使用字符串连接。
方法1(推荐):
stmt, err := dBusers.Prepare("SELECT id, name, email, username FROM users WHERE name LIKE ?;")
if err != nil {
logging.LogError("Could Not Query All Users: "+err.Error())
return nil, errors.New("Could Not Query Users")
}
rows, err := stmt.Query("%" + name + "%")
方法2:
stmt, err := dBusers.Prepare("SELECT id, name, email, username FROM users WHERE name LIKE '%' + ? + '%';")
if err != nil {
logging.LogError("Could Not Query All Users: "+err.Error())
return nil, errors.New("Could Not Query Users")
}
rows, err := stmt.Query(name)
我会推荐第一种方法,因为它不会强迫你总是使用“包含”搜索。你可以有选择地使用相同的语句来做精确的(只是名称),以(名称+“%”)开头,结束with(“%”+ name)或contains(“%”+ name +“%”)搜索。
PS:考虑到这一点,第二种方法可能导致注射,不确定,需要更多地考虑它。