Подтвердить что ты не робот

Как я могу предотвратить атаки SQL-инъекций в Go при использовании "database/sql"?

Создание моего первого веб-приложения и лучше понять SQL-инъекцию (https://github.com/astaxie/build-web-application-with-golang/blob/master/en/eBook/09.4.md).

Сколько защиты от SQL-инъекции я получаю, просто используя библиотеку "database/sql" и создавая запросы, используя "?" вместо объединения строк? Какие атаки SQL-инъекций мне еще придется беспокоиться в этом случае?

4b9b3361

Ответ 1

Пока вы используете 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"))

Ответ 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

ссылка: fooobar.com/info/14412975/...