Предотвратить внедрение SQL в Go Postgresql

Oct 02 2020

Я исследую форум postgresql-инъекций в Go и нашел полезную информацию о SQL-инъекциях, как показано ниже:

Как выполнить поиск IN в SQL с помощью Golang?

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

но мне все еще нужен совет, потому что мой код на Go использует другой код и варианты использования. некоторые варианты использования / вопросы, по которым мне нужен совет, похожи на это

  1. Использование цикла запросов для множественной вставки, например, INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)с использованием fmt.Sprintf, я знаю, что использование sprinft - это плохо. так есть ли какое-нибудь решение для этого запроса цикла для вставки? Пример:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)
  2. Безопасно ли использовать fmt.Sprintf для генерации запроса, если %dвместо параметра используется %s?
  3. Использование инструкции Prepare и Query безопасно, но что, если я использую функцию Select (используя $1,$2) и функция NamedQuery (с использованием структуры с именем.) Пример: Select * from a where text = $1-> использует этот $1сейф? и Ex: Select * from a where text = :text-> безопасно ли это в функции NamedQuery?

Любезно нужен ваш совет, ребята. Спасибо!

Ответы

5 KennyGrant Oct 02 2020 at 18:20

Во-первых, обычно предпочитаете использовать заполнители db? 1 доллар и т. Д.

  1. Да, использовать fmt.Sprintf с целочисленными параметрами для построения SQL безопасно, хотя стоит избегать, если вы можете, но ваш третий параметр -% s - избегайте этого и используйте?
  2. Да, использовать fmt.Sprintf с целочисленными параметрами безопасно, но% s или% v намного более рискованны, и я бы избегал, не понимаю, зачем вам это нужно.
  3. Используйте здесь заполнители, тогда да, это безопасно.

Основные правила:

  • Используйте заполнители по умолчанию, редко используется% d (как, например, в вашем запросе IN)
  • Разберите параметры на типы, такие как целое число, перед проверкой или использованием
  • По возможности избегайте конкатенации строк и особенно опасайтесь строковых параметров.
  • Всегда жестко кодируйте такие вещи, как имена столбцов и таблиц, никогда не создавайте их из пользовательского ввода (например,? Sort = mystringcolname)
  • Всегда проверяйте, что параметры, которые вы получаете, являются только авторизованными для этого пользователя.