1

问题一:

我有下面的 MySQL 查询,它工作正常,但我刚刚发现这不是一种安全的方法,因为它对 SQL 注入开放。如您所见,如果我想作为参数传递,where 子句是一个问题。

_, err := dbmap.Select(&response.AppsData, "SELECT...", ?)

任何建议都非常受欢迎。

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)

问题 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")

这个订单是有史以来最简单的事情......为什么它不起作用?

4

2 回答 2

7

您绝对不想自己“转义”任何字符串,也不想连接字符串来进行查询。

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

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

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

于 2015-06-15T11:52:52.253 回答
-2

我不懂 Go 语言。但大多数语言都有转义字符串的功能(PHP 示例: http: //php.net/manual/en/function.mysql-real-escape-string.php)。如果您只在查询中插入整数,则只需将值从字符串转换为整数。

看看这个:http ://astaxie.gitbooks.io/build-web-application-with-golang/content/en/09.4.html也许你会找到一些答案。

关于你的 ORDER - 你能把你正在调用的完整 sql 查询放在这里吗?

于 2015-06-15T10:57:44.630 回答