防止SQL注入

Aar*_*nny 0 mysql go gorp

问题1:

我有下面的MySQL查询工作正常但我刚刚发现这不是一个安全的方法,因为它开放的SQL注入.如果我想作为参数传递,你可以看到where子句是一个问题.

_, err := dbmap.Select(&response.AppsData, "SELECT...", ?)
Run Code Online (Sandbox Code Playgroud)

任何建议很多appriciated.

where := ""

for i := 0; i < (len(acl_user_apps)); i++ {
    fmt.Println(acl_user_apps[i].AppId)
    fmt.Println(acl_user_apps[i].Permissions)

    if where == "" {
        where = "WHERE Apps.id=" + strconv.Itoa(acl_user_apps[i].AppId)
    } else {
        where = where + " OR Apps.id=" + strconv.Itoa(acl_user_apps[i].AppId)
    }
}

query := "SELECT Apps.*, GROUP_CONCAT(DISTINCT IFNULL(AppCategoryMatches.category_id,'-1') SEPARATOR ',') as temp,   GROUP_CONCAT(DISTINCT IFNULL(AppCategories.category_name,'-1') SEPARATOR ',') as tmp_name FROM Apps LEFT JOIN AppCategoryMatches ON AppCategoryMatches.app_id=Apps.id LEFT JOIN AppCategories ON (AppCategoryMatches.`category_id` = AppCategories.id) " + where + " GROUP BY Apps.id ORDER BY " + sort_by + " " + order_by + " LIMIT " + limit + " OFFSET " + offset)
_, err := dbmap.Select(&response.AppsData,query)
Run Code Online (Sandbox Code Playgroud)

问题2:也只是想知道是否有人通过ORDER参数的问题...

_, err := dbmap.Select(&response.AppsData,
        "SELECT Apps.*, GROUP_CONCAT(DISTINCT IFNULL(AppCategoryMatches.category_id,'-1') SEPARATOR ',') as temp, GROUP_CONCAT(DISTINCT IFNULL(AppCategories.category_name,'-1') SEPARATOR ',') as tmp_name FROM Apps LEFT JOIN AppCategoryMatches ON AppCategoryMatches.app_id=Apps.id LEFT JOIN AppCategories ON (AppCategoryMatches.category_id = AppCategories.id) GROUP BY Apps.id ORDER BY ?", "title")
Run Code Online (Sandbox Code Playgroud)

这个ORDER是最简单的事情......为什么它不起作用?

eli*_*rar 5

你绝对不希望自己"转义"任何字符串,也不想连接字符串来进行查询.

  1. Go database/sql(http://golang.org/pkg/database/sql/)包默认支持参数化查询 - 例如db.Query("SELECT * FROM users WHERE id=? AND active=?", id, userStatus)- ?作为mySQL的占位符来处理变量.

  2. 您可以(与参数化查询结合使用)使用像mgutz/dat这样的查询构建器,如果您不擅长编写原始SQL,则可以提供帮助.像这样的包或sqlx也有助于在应用程序中对结构或映射打包/解包查询.

本教程中还有一个很好的指南,可以使用Go的数据库包.我强烈建议阅读它.