构建我的第一个网络应用程序,并希望更好地理解SQL注入(https://github.com/astaxie/build-web-application-with-golang/blob/master/en/eBook/09.4.md)。
我总是使用' database / sql'来防止SQL注入有多少保护?库和使用'?'构建查询而不是连接字符串?在这种情况下,我仍然需要担心哪种SQL注入攻击?
答案 0 :(得分:23)
// 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"))
答案 1 :(得分:2)
我同意@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