--- title: "Аудит Leadera" date: 2026-03-30 tags: ["audit", "leadera", "security", "ux"] --- ## Обзор проекта 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 ### Рекомендации по безопасности 1. Реализовать rate limiting для аутентификации 2. Добавить CSRF защиту 3. Перенести JWT токены в httpOnly cookies 4. Реализовать систему мониторинга и оповещений о подозрительной активности 5. Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД) 6. Реализовать ротацию секретов 7. Добавить тесты безопасности ## UX улучшения ### Фронтенд 1. **Улучшить валидацию форм**: Добавить реальную-time валидацию и подсказки 2. **Добавить индикацию загрузки**: Skeleton loaders для всех асинхронных операций 3. **Улучшить обработку ошибок**: Пользовательские сообщения об ошибках с возможностью повторной попытки 4. **Добавить отключенные состояния**: Кнопки должны быть disabled во время загрузки 5. **Мобильная адаптация**: Проверка и улучшение мобильного UI 6. **Доступность**: Добавить ARIA labels и проверить доступность ### Бэкенд 1. **Улучшить пагинацию**: Добавить валидацию и лимиты 2. **Добавить bulk операции**: Оптимизировать массовые операции 3. **Улучшить обработку ошибок**: Более информативные сообщения 4. **Добавить метрики**: Время выполнения запросов, количество запросов 5. **Оптимизировать запросы**: Проверка на 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 недели с учётом приоритетов