web-dev-qa-db-ja.com

「database / sql」の使用中にGoでSQLインジェクション攻撃を防ぐにはどうすればよいですか?

私の最初のWebアプリを構築し、SQLインジェクションをよりよく理解したい( https://github.com/astaxie/build-web-application-with-golang/blob/master/en/eBook/09.4.md )。

常に 'database/sql'ライブラリを使用し、 '?'を使用してクエリを作成するだけで、SQLインジェクションに対するどの程度の保護が得られますか?文字列を連結する代わりに?その場合でも、どのようなSQLインジェクション攻撃を心配する必要がありますか?

22
John Montague

Prepare または Query を使用している限り、安全です。

// 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"))
34
OneOfOne

@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

ref: https://stackoverflow.com/a/46476451/5466534

2
Sahith Vibudhi