如何在Go中使用“database/sql”时防止SQL注入攻击?

问题描述 投票:0回答:3

构建我的第一个 Web 应用程序,并希望更好地理解 SQL 注入 (https://github.com/astaxie/build-web-application-with-golang/blob/master/en/eBook/09.4.md)。

通过始终使用“database/sql”库并使用“?”构建查询,我可以获得多少针对 SQL 注入的保护?而不是连接字符串?在这种情况下我还需要担心什么样的 SQL 注入攻击?

go sql-injection
3个回答
46
投票

只要您使用PrepareQuery,您就是安全的。

// this is safe
db.Query("SELECT name FROM users WHERE age=?", req.FormValue("age"))
// this allows sql injection.
db.Query("SELECT name FROM users WHERE age=" + req.FormValue("age"))

7
投票

我同意@Oneonone的回答。

如果您正在检索数据,请执行以下操作:

db.Query("SELECT name FROM users WHERE age=?", req.FormValue("age"))

如果您必须使用相同的查询安全地插入大量数据,那么Prepare就可以派上用场。你可以做这样的事情:

tx, err := db.Begin()
if err != nil {
    return nil,err
}
stmt, err := tx.Prepare("INSERT INTO users VALUES (?, ?)")
if err != nil {
    tx.Rollback()
    return nil,err
}
defer 
for i := 0; i < 10; i++ {
    _, err = stmt.Exec(i, "dummy")
    if err != nil {
        tx.Rollback()
        return nil,err
    }
}
err = tx.Commit()
if err != nil {
    stmt.Close()
    tx.Rollback()
    return nil,err
}
stmt.Close()
return someValue, nil

参考:https://stackoverflow.com/a/46476451/5466534


0
投票

如果准备好的语句不够,您可以使用查询生成器。

我创建了 hotcoal 包,它可以帮助您保护手工编写的 SQL 免受注入。它提供了一个最小的 API,您可以将它与任何 SQL 库一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.