Как предотвратить SQL-инъекцию в поле JSON / JSONB PostgreSQL? - PullRequest
0 голосов
/ 09 января 2019

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

Это решает проблему с полем с одним значением, потому что вы можете удалить кавычки, но я не могу сделать это, фильтруя поле JSON / JSONB, как показано ниже, потому что $1 считается строкой:

`SELECT * FROM foo WHERE bar @> '{"baz": "$1"}'`

Следующее работает, но оно подвержено SQL-инъекциям:

`SELECT * FROM foo WHERE bar @> '{"baz": "` + "qux" + `"}'`

Как мне решить эту проблему?


ИЗМЕНЕНО после комментария @ mkopriva:

Как бы построить этот json [{"foo": $1}] с функциями jsonb_*? Пробовал ниже безуспешно:

jsonb_build_array(0, jsonb_build_object('foo', $1::text))::jsonb

Там нет ошибки SQL. Фильтр просто не работает. Есть способ, которым я могу проверить построенный SQL? Я использую database/sql нативную библиотеку.

1 Ответ

0 голосов
/ 10 января 2019

Это то, что вы ищете?

type MyStruct struct {
    Baz string
}

func main() {
    db, err := sql.Open("postgres", "postgres://...")
    if err != nil {
        log.Panic(err)
    }

    s := MyStruct{
        Baz: "qux",
    }

    val, _ := json.Marshal(s)
    if err != nil {
        log.Panic(err)
    }

    if _, err := db.Exec("SELECT * FROM foo WHERE bar @> ?", val); err != nil {
        log.Panic(err)
    }
}

Как примечание, Exec не для поиска (хотя я сохранил его для вас, чтобы решение соответствовало вашему примеру). Проверьте db.Query (Фантастический учебник здесь: http://go -database-sql.org / retrieving.html )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...