【问题标题】:How do you use URL.Query().Get() to fill in a SELECT statement using Golang如何使用 URL.Query().Get() 使用 Golang 填写 SELECT 语句
【发布时间】:2021-09-01 14:21:45
【问题描述】:
func startHandler(w http.ResponseWriter, r *http.Request) {
    conn_str := dbuser + ":" + dbpass + "@tcp(" + dbhost + ":" + dbport + ")/" + dbdb
    log.Println(conn_str)

    db, err := sql.Open("mysql", conn_str)
    if err != nil {
        log.Println("DB Error - Unable to connect:", err)
    }
    defer db.Close()

    table := r.URL.Query().Get("table")

    
        rows, _ := db.Query("SELECT * FROM "+ table) //selects all columns from table
        cols, _ := rows.Columns()

        fmt.Fprintf(w, "%s\n", cols)

当我尝试这个时,它不会填写我从我的网站输入的值。如果我 log.Println(table) 它确实显示在我的终端中。但它不会显示在网站上或用表格填写select语句......

【问题讨论】:

  • 不像你做的那样,通过连接来自不受信任的来源(用户指定的查询参数)的字符串来构建查询。这样做会引入 SQL 注入漏洞!
  • 这是供个人使用的。我只是在创建一个 webapp 来获取我输入的表的字段。我试图只获取表的值来填写 FROM 语句
  • db.Query 返回的错误可能会告诉您问题所在。

标签: mysql go request


【解决方案1】:

假设您从 API 调用它,我会添加一些内容,更不用说避免使用通配符 (*) 选择。

编辑:我想我可能误解了你的问题,我会看看我是否可以给出更好的答案。

您是说您有一个表格的打印值,但数据库没有响应?其他评论者是正确的,而不是“_”,得到一个真正的错误和 fmt.Println(err.Error())。

编辑 2:@jub0bs 提出的另一个好处是,这是一个巨大的漏洞。 Go 非常支持这一点,允许您执行以下操作:

db.Query("SELECT * FROM ?",table)

而不是你目前拥有的。

我刚刚运行了以下代码:

results,err := publicDB.Query("SELECT * FROM "+r.URL.Query().Get("name"))+" LIMIT 1"
    if err != nil {
        fmt.Println(err.Error())
    }
    for results.Next(){
        fmt.Println(results.Columns())
    }

它奏效了。我调用了网址www.mysite.com/endpoint?name=tablename

【讨论】:

  • 这个应用程序的目的只是拉取特定表的所有字段。这样我就不必让别人向我发送表格的字段,我可以运行它并获取它们。
  • Gotcha @sippi181,我不熟悉 rows.Columns() 语法。看看我最近的两次编辑,如果你得到的只是列名,我建议最后做一个 LIMIT 1。
  • 我尝试使用 ("SELECT * FROM ?", table) 仍然无法正常工作。我收到错误 1064:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在“?”附近使用的正确语法在第 1 行。
  • 有趣,你用什么驱动?原生数据库/sql?我与 github.com/go-sql-driver/mysql 建立联系,但我希望它会是一样的。我想知道它是否不允许表名可变,因为它需要准备对某个表的查询。当你保持原来的方式时,你得到了什么错误?
  • 错误 1064:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法。我也使用 github.com/go-sql-driver/mysql
猜你喜欢
  • 2016-08-04
  • 2012-10-18
  • 2020-08-26
  • 2015-09-17
  • 2023-02-02
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多