尝试查询包含使用Prepare在golang中搜索

时间:2017-05-09 19:50:37

标签: sql go

我有一个准备和查询功能,当我放置?在搜索中它工作正常。当我尝试使用%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)

2 个答案:

答案 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:考虑到这一点,第二种方法可能导致注射,不确定,需要更多地考虑它。