Стандартный и наиболее эффективный способ предотвратить SQL-инъекцию в Go (и большинстве языков) — использовать подготовленные операторы и параметризованные запросы.
Пакет database/sql поддерживает это. Вместо построения SQL-запросов путем объединения строк с пользовательским вводом вы используете заполнители в своем SQL-запросе и передаете введенные пользователем значения отдельно. Драйвер базы данных обеспечивает безопасное экранирование и заключение этих значений в кавычки.
Пример
// BAD (vulnerable to SQL injection)// query := fmt.Sprintf("SELECT * FROM users WHERE username = '%s'", userInput)// rows, err := db.Query(query)// GOOD (safe - using parameterized query)
query := "SELECT * FROM users WHERE username = $1"// or ? for MySQL
rows, err := db.Query(query, userInput)
```
## Разбор
* ORM и построители запросов, построенные на основе `database/sql`, также используют внутри себя подготовленные операторы, обеспечивая уровень абстракции, но по-прежнему полагаясь на этот основной механизм.
## Итог
Стандартный и наиболее эффективный способ предотвратить SQL-инъекцию в Go (и большинстве языков) — использовать **подготовленные операторы и параметризованные запросы**.
Как вы справляетесь с потенциальными уязвимостями внедрения SQL в Go? · Sobeso