【问题标题】:SQL prepare for WHERE IN [duplicate]SQL为WHERE IN做准备[重复]
【发布时间】:2014-06-11 02:34:11
【问题描述】:

在编写 Web 应用程序时,我们将使用 SQL 准备而不是连接 SQL 字符串来避免 SQL 注入。例如:

sql.exec("select * from user where user_id=?", user_id)

但是如何在 SQL 中编写准备WHERE...IN?例如:

sql.exec("select * from user where user_id in ?", user_ids)

如果不可能。在这种情况下,避免 SQL 注入的正确方法是什么?

谢谢。

【问题讨论】:

  • 也许我不清楚。我不是在问 PHP 的方式。我想知道语言中是否有一些通用的方法支持MySQL驱动。
  • 应用程序宿主语言是什么?请注意,大多数驱动程序不支持数组参数,因此基本答案是相同的 - 构造替换变量列表,然后绑定值。
  • @Clockwork-Muse 我现在正在使用 Golang。
  • 怎么样:sql.exec("select * from user where user_id in (?)", "1,2,3,4")?

标签: mysql sql security go prepared-statement


【解决方案1】:

将 user_ids 字符串更改为 id 数组:

idArr = strings.Split(user_ids, ",")

创建 sql:

vals := []interface{}{}
sqlStr := "select * from user where user_id in ("
for _,v := range idArr {
    vals = append(vals, v)
    sqlStr += "?,"
}
sqlStr = strings.TrimRight(sqlStr, ",")
sqlStr += ")"

stmt, err := db.Prepare(sqlStr)
if err!=nil{
    return err
}
defer stmt.Close()

rows, err := stmt.Query(vals...)

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多