13 KiB
title, date, tags
| title | date | tags | ||||
|---|---|---|---|---|---|---|
| Аудит Leadera | 2026-03-30 |
|
Обзор проекта
Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:
Стек технологий:
- Бэкенд: Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx
- Фронтенд: Angular (версия не указана), HttpClient
- Инфраструктура: Docker, PM2, Hugo для документации
Архитектура:
- Clean Architecture с разделением на слои (handlers, service, repository)
- RESTful API с использованием JWT для аутентификации
- Управление правами доступа через RBAC (Role-Based Access Control)
- Поддержка пространств (spaces) как основной изоляции данных
- PostgreSQL с миграциями через golang-migrate
Основные сущности:
- Пользователи (Users)
- Пространства (Spaces)
- Диаграммы Ганта (Gantt Charts)
- Секции диаграмм (Gantt Sections)
- Задачи (Gantt Tasks)
Бекенд — найденные проблемы
1. Критичные уязвимости
1.1 Отсутствие валидации ввода данных
Критичность: Critical
Файл: internal/dto/auth/login_request.go:5-6
Описание: В DTO используются базовые теги валидации (binding:"required,email"), но они не применяются в handlers. В handlers используется только c.ShouldBindJSON() без дополнительной валидации.
Рекомендация: Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).
1.2 Риск SQL-инъекций
Критичность: High
Файл: internal/repository/space_repository.go:68-73
Описание: В методе GetBySlug используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.
Рекомендация: Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.
1.3 Небезопасное хранение секретов
Критичность: High
Файл: internal/config/config.go:13-15
Описание: JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.
Рекомендация: Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.
1.4 Отсутствие ограничений на частоту запросов
Критичность: Medium
Описание: Нет защиты от brute force атак на аутентификацию.
Рекомендация: Реализовать rate limiting для эндпоинтов аутентификации.
2. Проблемы безопасности
2.1 XSS валидация
Критичность: Medium
Файл: internal/handlers/space_handler.go
Описание: Нет очистки пользовательского ввода перед сохранением в базу данных.
Рекомендация: Добавить HTML экранирование пользовательских данных.
2.2 Отсутствие CSRF защиты
Критичность: Medium
Файл: internal/middleware/cors_middleware.go
Описание: Нет CSRF токенов или других механизмов защиты.
Рекомендация: Реализовать CSRF защиту для изменяющих операций.
2.3 Небезопасная обработка ошибок
Критичность: Medium
Файл:/internal/utils/response.go
Описание: Возвращаемые ошибки могут содержать внутренние детали реализации.
Рекомендация: Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.
3. Архитектурные проблемы
3.1 Отсутствие тестов
Критичность: Medium
Файл: Отсутствие тестовых файлов
Описание: Найден только один тестовый helper файл, нет unit и интеграционных тестов.
Рекомендация: Добавить покрытие тестами, особенно для критичных бизнес-логик.
3.2 Отсутствие индексов в БД
Критичность: Medium
Файл: migrations/000001_create_users_table.up.sql:15-16
Описание: Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.
Рекомендация: Добавить индексы для часто используемых запросов.
3.3 Плохая обработка пагинации
Критичность: Medium
Файл: internal/repository/space_repository.go:39-45
Описание: Пагинация реализована, но нет валидации параметров page и per_page.
Рекомендация: Добавить валидацию и ограничение на максимальное количество элементов на страницу.
4. Проблемы конфигурации
4.1 Слабые настройки по умолчанию
Критичность: Medium
Файл: .env.example
Описание: JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.
Рекомендация: Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.
4.2 Небезопасные настройки CORS
Критичность: Medium
Файл: .env.example
Описание: CORS разрешает любые origin в development.
Рекомендация: В продакшене использовать конкретные домены.
Фронтенд — найденные проблемы
1. Критичные уязвимости
1.1 Небезопасное хранение токенов
Критичность: Critical
Файл: src/app/core/auth/auth.service.ts:19-21
Описание: Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.
Рекомендация: Перенести токены в httpOnly cookie или secure storage.
1.2 Отсутствие валидации на клиенте
Критичность: Medium
Файл: src/app/core/auth/auth.models.ts
Описание: Нет валидации email, пароля и других полей на клиенте.
Рекомендация: Добавить клиентскую валидацию форм перед отправкой запросов.
2. Проблемы безопасности
2.1 Отсутствие CSP
Критичность: Medium
Описание: Нет Content Security Policy для защиты от XSS и других атак.
Рекомендация: Добавить заголовки CSP с разрешенными источниками.
2.2 Нет ограничений на длину ввода
Критичность: Medium
Описание: Нет ограничения максимальной длины вводимых данных.
Рекомендация: Добавить maxlength атрибуты к input полям.
3. UX проблемы
3.1 Нет индикации загрузки
Критичность: Low
Файл: src/app/core/auth/auth.service.ts:45-47
Описание: Для некоторых операций нет индикации загрузки.
Рекомендация: Добавить skeleton loaders или spinners для всех асинхронных операций.
3.2 Плохая обработка ошибок
Критичность: Low
Файл: src/app/core/auth/auth.interceptor.ts:28-32
Описание: Обработка ошибок 401 не всегда приводит к корректному перенаправлению.
Рекомендация: Стандартизовать обработку ошибок и отображение пользователю.
Безопасность
Текущие меры безопасности
- Использование JWT токенов для аутентификации
- Параметризованные SQL запросы (защита от SQL инъекций)
- CORS настройка
- RBAC система через пространства и роли
- Пароли хранятся в виде хешей
- Refresh токены для управления сессиями
Отсутствующие меры
- Rate limiting
- CSRF protection
- Content Security Policy
- Input validation middleware
- SQL injection protection for dynamic queries
- XSS protection
- Secure cookie storage
- Brute force protection
Рекомендации по безопасности
- Реализовать rate limiting для аутентификации
- Добавить CSRF защиту
- Перенести JWT токены в httpOnly cookies
- Реализовать систему мониторинга и оповещений о подозрительной активности
- Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД)
- Реализовать ротацию секретов
- Добавить тесты безопасности
UX улучшения
Фронтенд
- Улучшить валидацию форм: Добавить реальную-time валидацию и подсказки
- Добавить индикацию загрузки: Skeleton loaders для всех асинхронных операций
- Улучшить обработку ошибок: Пользовательские сообщения об ошибках с возможностью повторной попытки
- Добавить отключенные состояния: Кнопки должны быть disabled во время загрузки
- Мобильная адаптация: Проверка и улучшение мобильного UI
- Доступность: Добавить ARIA labels и проверить доступность
Бэкенд
- Улучшить пагинацию: Добавить валидацию и лимиты
- Добавить bulk операции: Оптимизировать массовые операции
- Улучшить обработку ошибок: Более информативные сообщения
- Добавить метрики: Время выполнения запросов, количество запросов
- Оптимизировать запросы: Проверка на N+1 запросы
Приоритизированный план исправления
| Приоритет | Проблема | Файлы | Трудоёмкость |
|---|---|---|---|
| Critical | Хранение JWT токенов в localStorage | frontend/src/app/core/auth/auth.service.ts | 2 часа |
| Critical | Отсутствие валидации ввода данных | backend/internal/handlers/*.go | 4 часа |
| High | Небезопасные настройки JWT | backend/internal/config/config.go | 1 час |
| High | Rate limiting для аутентификации | backend/internal/middleware/ | 3 часа |
| Medium | Отсутствие тестов | backend/internal/ | 8 часов |
| Medium | XSS валидация | backend/internal/handlers/*.go | 2 часа |
| Medium | CSRF защита | backend/internal/middleware/ | 2 часа |
| Low | UX улучшения (индикация загрузки) | frontend/src/app/ | 3 часа |
| Low | Оптимизация запросов | backend/internal/repository/ | 4 часа |
| Low | Документация API | backend/api/ | 2 часа |
Общая трудоёмкость: ~31 час
Рекомендуемый срок выполнения: 2-3 недели с учётом приоритетов