web-dev-qa-db-fra.com

Comment puis-je empêcher les attaques par injection SQL dans Go lors de l'utilisation de "database / sql"?

Construire ma première application web et vouloir mieux comprendre l'injection SQL ( https://github.com/astaxie/build-web-application-with-golang/blob/master/en/eBook/09.4.md ).

Quelle protection contre l'injection SQL est-ce que j'obtiens en utilisant toujours la bibliothèque 'database/sql' et en construisant des requêtes en utilisant '?' au lieu de concaténer des chaînes? De quel type d'attaque par injection SQL devrai-je encore me préoccuper dans ce cas?

22
John Montague

Tant que vous utilisez Préparez ou Requête , vous êtes en sécurité.

// 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

Je suis d'accord avec la réponse de @ Oneonone.

Si vous récupérez des données, faites quelque chose comme:

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

Si vous devez insérer un grand nombre de données en toute sécurité, en utilisant la même requête, c'est là que la préparation est pratique. vous pouvez faire quelque chose comme ça:

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

réf: https://stackoverflow.com/a/46476451/5466534

2
Sahith Vibudhi