Go
Топ-10 уязвимостей в Go-приложениях
Go часто считают «безопасным» языком благодаря строгой типизации и управлению памятью. Но безопасность приложения зависит не только от языка — она определяется тем, как разработчик пишет код. 1. SQL…
Go часто считают «безопасным» языком благодаря строгой типизации и управлению памятью. Но безопасность приложения зависит не только от языка — она определяется тем, как разработчик пишет код. 1. SQL…
Топ-10 уязвимостей в Go-приложениях
Go часто считают «безопасным» языком благодаря строгой типизации и управлению памятью. Но безопасность приложения зависит не только от языка — она определяется тем, как разработчик пишет код.
1. SQL Injection
Несмотря на строгую типизацию, Go-разработчики часто используют fmt.Sprintf для формирования SQL-запросов:
// Уязвимо:
query := fmt.Sprintf("SELECT * FROM users WHERE name='%s'", username)
db.QueryRow(query)
// Правильно:
db.QueryRow("SELECT * FROM users WHERE name=$1", username)
2. Reflected XSS в шаблонах
Пакет html/template защищает автоматически, но text/template — нет. Смешивать их опасно.
3. Path Traversal через filepath.Join
filepath.Join не защищает от ../. Всегда проверяй, что путь находится внутри разрешённой директории через strings.HasPrefix или filepath.Rel.
4. SSRF при http.Get с пользовательским URL
Проверяй схему и хост перед любым внешним HTTP-запросом. Блокируй file://, localhost, 169.254.0.0/16.
5. Небезопасный десериализация JSON
json.Unmarshal в интерфейс может привести к type confusion при дальнейшей обработке. Используй конкретные структуры.
6. Гонки данных в глобальных map
Глобальные map без мьютекса — источник race condition. Используй sync.RWMutex или sync.Map.
7. Утечка секретов через stack trace
recover() может случайно выводить секреты в HTTP-ответ. Настраивай middleware правильно.
8. Command Injection через exec.Command
Никогда не передавай пользовательский ввод в exec.Command через shell=true или через конкатенацию строк.
9. Небезопасные заголовки CORS
Access-Control-Allow-Origin: * вместе с Access-Control-Allow-Credentials: true — классическая ошибка.
10. Хранение паролей в открытом виде
Всегда используй bcrypt или argon2. MD5 и SHA-1 для паролей — неприемлемо.
Все эти уязвимости можно найти и исправить в лабораториях Hack & Fix.
Раз в 2 недели — свежий разбор уязвимости
Без спама и рекламы: только новые статьи и лабораторные Hack & Fix. Выбирайте канал — Telegram для быстрого чтения, RSS для читалок.
Уточняющие вопросы, разбор пограничных кейсов и обмен опытом — в чате Hack & Fix. Модераторы и авторы читают.
Обсудить в Telegram-чате