Предотвратить внедрение SQL в Go Postgresql
Oct 02 2020
Я исследую форум postgresql-инъекций в Go и нашел полезную информацию о SQL-инъекциях, как показано ниже:
Как выполнить поиск IN в SQL с помощью Golang?
Как я могу предотвратить атаки SQL-инъекций в Go при использовании "database / sql"?
но мне все еще нужен совет, потому что мой код на Go использует другой код и варианты использования. некоторые варианты использования / вопросы, по которым мне нужен совет, похожи на это
- Использование цикла запросов для множественной вставки, например,
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) - Безопасно ли использовать fmt.Sprintf для генерации запроса, если
%dвместо параметра используется%s? - Использование инструкции 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 доллар и т. Д.
- Да, использовать fmt.Sprintf с целочисленными параметрами для построения SQL безопасно, хотя стоит избегать, если вы можете, но ваш третий параметр -% s - избегайте этого и используйте?
- Да, использовать fmt.Sprintf с целочисленными параметрами безопасно, но% s или% v намного более рискованны, и я бы избегал, не понимаю, зачем вам это нужно.
- Используйте здесь заполнители, тогда да, это безопасно.
Основные правила:
- Используйте заполнители по умолчанию, редко используется% d (как, например, в вашем запросе IN)
- Разберите параметры на типы, такие как целое число, перед проверкой или использованием
- По возможности избегайте конкатенации строк и особенно опасайтесь строковых параметров.
- Всегда жестко кодируйте такие вещи, как имена столбцов и таблиц, никогда не создавайте их из пользовательского ввода (например,? Sort = mystringcolname)
- Всегда проверяйте, что параметры, которые вы получаете, являются только авторизованными для этого пользователя.