Перейти к содержимому

Поиск по платформе

222 слова 1 минута чтения

Go

Топ-10 уязвимостей в Go-приложениях

Go часто считают «безопасным» языком благодаря строгой типизации и управлению памятью. Но безопасность приложения зависит не только от языка — она определяется тем, как разработчик пишет код. 1. SQL…

H
Hack & Fix
AppSec & безопасная разработка
Кратко

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-чате
Добавлено в список чтения