如何在使用"database/sql"时阻止Go中的SQL注入攻击?

Joh*_*gue 21 sql-injection go

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

我总是使用'​​database/sql'库并使用'?'构建查询,从而获得多少SQL注入保护?而不是连接字符串?在这种情况下,我仍然需要担心什么样的SQL注入攻击?

One*_*One 30

只要您使用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"))
Run Code Online (Sandbox Code Playgroud)

  • Exec还允许绑定值而不使用Prepare.它是否安全,我的猜测是它制作了一个隐含的Prepare语句,但我没有查看代码 (4认同)

Sah*_*dhi 7

我同意@Oneonone 的回答。

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

db.Query("SELECT name FROM users WHERE age=?", req.FormValue("age"))
Run Code Online (Sandbox Code Playgroud)

如果您必须使用相同的查询安全地插入大量数据,这就是 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
Run Code Online (Sandbox Code Playgroud)

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