如何使用参数化查询按名称搜索列?

Joe*_*oey 6 mysql sql sql-injection go

我的用户应该能够通过在输入框中输入搜索词并从下拉框中选择他们想要搜索的列来搜索数据库。

但是,我找不到在 golang 中参数化查询的方法,以便将列名识别为列名而不是值。让我举个例子吧:

rows, err := db.Query("SELECT * FROM mytable WHERE ? = ?", col, searchStr)
Run Code Online (Sandbox Code Playgroud)

我打开了 MySQL 日志记录,这是结果查询:

   41 Execute   SELECT *
    FROM mytable 
    WHERE 'Username' = 'Foo'
Run Code Online (Sandbox Code Playgroud)

显然Username不应该有单引号。

如何参数化此查询?我是否必须编写应用程序逻辑来检查每个查询的正确列名并使用字符串操作将列名添加到查询中(也许使用一些占位符来查找和替换)?

eva*_*nal 7

这是试图帮助您避免错误的参数(防止 SQL 注入之类的事情),但并非旨在对值以外的任何内容进行替换。您希望它插入一个表名。不幸的是,代码知道col's 的类型(字符串)并引用它,因为在 SQL 中它是 nvarchar 并且这就是它们的文字的编写方式,用单引号括起来。可能看起来有点像黑客,但你需要这个;

db.Query(fmt.Sprintf("SELECT * FROM mytable WHERE %s = ?", col), searchStr)
Run Code Online (Sandbox Code Playgroud)

在将表名传递给查询字符串之前将其放入查询字符串中,Query这样它就不会被视为参数(即在 where 子句中使用的值)。