2015-06-15 172 views
0

问题1:防止SQL注入

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

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

任何建议很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) 

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

这条命令是最简单的东西是永远不会......为什么不是它的工作?

+2

每个问题有一个问题。 -1 – rightfold

+0

你的ORDER查询有什么错误? – elithrar

+0

@elithrar请在第二个答案的评论中查看下面的查询样本。 –

回答

-2

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

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

而关于你的订单 - 你可以在这里完整的SQL查询,你打电话?

+0

你好OndraTom, 似乎并没有一个转义字符串函数去...我不能找到。它实际上是一个订单问题(不限制) –

+0

检查文章。有提示如何防止GO语言中的SQL注入:) – OndraTom

+3

请注意,在PHP中转义字符串也不是处理SQL查询的安全方式。您应尽可能使用PHP的'mysqli'包并编写参数化查询。 – elithrar

5

你绝对不希望自己“逃避”任何字符串,也不要连接字符串来进行查询。

  1. Go的database/sqlhttp://golang.org/pkg/database/sql/)包支持parameterised queries默认 - 例如db.Query("SELECT * FROM users WHERE id=? AND active=?", id, userStatus) - 其中?充当mySQL的占位符来处理您的变量。

  2. 您可以(结合参数化查询)使用查询构建器,如mgutz/dat,这可以帮助您处理原始SQL时不擅长的问题。像这样的软件包或sqlx还可帮助打包/解压缩应用程序中的结构或映射的查询。

还有一个伟大的指南in this tutorial使用Go的数据库包。我强烈建议阅读它。

+0

我想强调参数placehoder语法是特定于正在使用的驱动程序。对于MySQL(因为这个问题被标记)它会是'... id =? AND active =?',而不是'... id = $ 1 AND active = $ 2'。 [在这个答案中链接的教程有一小节关于此](http://go-database-sql.org/prepared.html#parameter-placeholder-syntax)。 –

+0

良好的捕捉纠正。太习惯Postgres的占位符! – elithrar

+0

乡亲非常感谢您的帮助......我改写的查询使用参数化查询,但不幸的是,错误依然存在, 我不能为了使用动态字段 –