Files
docs.a2v.space/content/guides/leadera-audit.md
T

243 lines
14 KiB
Markdown

---
title: "Аудит Leadera"
date: 2026-03-30
tags: ["audit", "leadera", "security", "ux"]
---
## Обзор проекта
Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:
### Бекенд
- **Стек:** Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT
- **Архитектура:** Clean Architecture с разделением на слои
- **Особенности:** RESTful API, автоматические миграции, система ролей через spaces
### Фронтенд
- **Стек:** Angular 21.1.3, Bootstrap 5, RxJS
- **Особенности:** JWT-аутентификация, перехватчики HTTP, lazy loading
## Бекенд — найденные проблемы
### Критические проблемы
#### 1. Уязвимость XSS в сериализации DOM
- **Файл:** `internal/handlers/space_handler.go:47-63`
- **Критичность:** **critical**
- **Описание:** В методе `GetSpaceMembers` используется `c.BindJSON(&req)` без валидации, что может привести к XSS при сериализации данных в JSON
- **Рекомендация:** Добавить валидацию DTO и использование HTML sanitizer
#### 2. Небезопасное хранение токенов
- **Файл:** `internal/utils/password.go:19-21`
- **Критичность:** **critical**
- **Описание:** Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора
- **Рекомендация:** Перейти на bcrypt для хэширования refresh токенов
#### 3. Отсутствие Rate Limiting
- **Файл:** Нет реализации
- **Критичность:** **high**
- **Описание:** Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак
- **Рекомендация:** Реализовать middleware для rate limiting
### Высокие проблемы
#### 4. Отсутствие валидации входных данных
- **Файл:** `internal/handlers/auth_handler.go:26-32, 52-58`
- **Критичность:** **high**
- **Описание:** Нет строгой валидации email, длинны строк и других параметров запросов
- **Рекомендация:** Внедрить библиотеку для валидации (go-playground/validator)
#### 5. Отсутствие защиты от CSRF
- **Файл:** Нет реализации
- **Критичность:** **high**
- **Описание:** Нет CSRF-токенов для POST/PUT/DELETE запросов
- **Рекомендация:** Реализовать CSRF middleware
#### 6. Потенциальные N+1 запросы
- **Файл:** `internal/repository/space_repository.go`
- **Критичность:** **high**
- **Описание:** Нет индексов и оптимизации для запросов с JOIN при получении членов spaces
- **Рекомендация:** Добавить правильные индексы и использовать eager loading
### Средние проблемы
#### 7. Отсутствие логирования ошибок
- **Файл:** `internal/handlers/gantt_handler.go:78-95`
- **Критичность:** **medium**
- **Описание:** Ошибки валидации не логируются, что затрудняет отладку
- **Рекомендация:** Структурированное логирование всех ошибок
#### 8. Жестко закодированные настройки
- **Файл:** `internal/middleware/space_middleware.go:121-128`
- **Критичность:** **medium**
- **Описание:** Статическая проверка subscription status без гибкой конфигурации
- **Рекомендация:** Вынести в конфигурацию возможные статусы подписки
#### 9. Отсутствие ограничений на количество записей
- **Файл:** `internal/handlers/gantt_handler.go`
- **Критичность:** **medium**
- **Описание:** Нет ограничений на количество задач, разделов или диаграмм на пользователя
- **Рекомендация:** Добавить лимиты через middleware
### Низкие проблемы
#### 10. Отсутствие валидации для special символов
- **Файл:** `internal/utils/validation.go:21-24`
- **Критичность:** **low**
- **Описание:** Валидация паролей не включает некоторые специальные символы
- **Рекомендация:** Расширить список разрешенных символов
#### 11. Отсутствие Health Check для базы данных
- **Файл:** `internal/handlers/handler.go`
- **Критичность:** **low**
- **Описание:** Health endpoint не проверяет доступность базы данных
- **Рекомендация:** Добавить ping к базе данных в health check
## Фронтенд — найденные проблемы
### Критические проблемы
#### 1. Хранение JWT токенов в localStorage
- **Файл:** `src/app/core/auth/auth.service.ts:25-40`
- **Критичность:** **critical**
- **Описание:** Токены хранятся в localStorage, уязвимом для XSS атак
- **Рекомендация:** Использовать HTTP-only cookies или secure storage
#### 2. Отсутствие Content Security Policy (CSP)
- **Файл:** `src/index.html`
- **Критичность:** **critical**
- **Описание:** Нет заголовков CSP для защиты от XSS
- **Рекомендация:** Добавить заголовки CSP в HTTP ответы
### Высокие проблемы
#### 3. Нет валидации форм на стороне клиента
- **Файл:** `src/app/pages/auth/components/sign-up/sign-up.component.ts`
- **Критичность:** **high**
- **Описание:** Формы не проходят полную валидацию перед отправкой
- **Рекомендация:** Реализовать полноценную клиентскую валидацию
#### 4. Отсутствие обработки race conditions
- **Файл:** `src/app/core/auth/auth.interceptor.ts:15-45`
- **Критичность:** **high**
- **Описание:** Потенциальные race conditions при обновлении токенов
- **Рекомендация:** Реализовать очередь запросов при обновлении токенов
#### 5. Нет ограничений на длину вводимых данных
- **Файл:** `src/app/components/forms/gantt-form.component.ts`
- **Критичность:** **high**
- **Описание:** Пользователь может вводить очень длинные тексты без ограничений
- **Рекомендация:** Добавить максимальную длину для полей ввода
### Средние проблемы
#### 6. Нет proper error handling states
- **Файл:** `src/app/layouts/components/navbar/navbar.component.ts`
- **Критичность:** **medium**
- **Описание:** Нет graceful handling ошибок при загрузке данных
- **Рекомендация:** Реализовать skeleton loaders и error boundaries
#### 7. Плохая производительность при большом количестве данных
- **Файл:** `src/app/pages/dashboard/gantt/gantt-page.component.ts`
- **Критичность:** **medium**
- **Описание:** Нет virtual scrolling для больших списков задач
- **Рекомендация:** Реализовать virtual scrolling и lazy loading
#### 8. Отсутствие a11y для некоторых компонентов
- **Файл:** `src/app/components/charts/gantt-chart/gantt-chart.component.ts`
- **Критичность:** **medium**
- **Описание:** Гант-диаграмма не имеет proper ARIA labels
- **Рекомендация:** Добавить ARIA атрибуты и keyboard navigation
### Низкие проблемы
#### 9. Нет CSRF protection
- **Файл:** `src/app/core/auth/auth.interceptor.ts`
- **Критичность:** **low**
- **Описание:** Отсутствие CSRF токенов для чувствительных операций
- **Рекомендация:** Добавить CSRF токены в заголовки
#### 10. Плохая мобильная адаптация
- **Файл:** `src/app/styles/gantt.scss`
- **Критичность:** **low**
- **Описание:** Нет proper responsive design для мобильных устройств
- **Рекомендация:** Добавить медиа-запросы и touch-friendly интерфейс
## Безопасность
### Обнаруженные уязвимости:
1. **XSS уязвимости** - Отсутствие валидации входных данных на бэкенде
2. **Небезопасное хранение токенов** - Refresh токены используют SHA256 вместо bcrypt
3. **Отсутствие rate limiting** - Уязвимость для brute-force атак
4. **CSRF уязвимости** - Отсутствие CSRF-токенов
5. **Storage vulnerabilities** - localStorage используется для хранения JWT
### Рекомендации по безопасности:
1. Реализовать Input Validation на всех уровнях
2. Перейти на HTTP-only cookies для токенов
3. Реализовать rate limiting middleware
4. Добавить CSRF protection
5. Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)
6. Реализовать proper logging и мониторинг
7. Добавить автоматические тесты безопасности
## UX улучшения
### Критические улучшения:
1. **Надежность аутентификации** - Реализовать MFA
2. **Уведомления об ошибках** - Лучшее error messaging
3. **Прогресс-бары** - Для долгих операций
### Высокие улучшения:
1. **Поиск по проекту** - Быстрый поиск across spaces
2. **Drag & Drop** - Для задач и диаграмм
3. **Keyboard shortcuts** - Повышение продуктивности
4. **Темная тема** - Улучшение UX при длительной работе
### Средние улучшения:
1. **Экспорт данных** -多种 форматы
2. **Коллаборация в реальном времени** - WebSocket для live updates
3. **Шаблоны диаграмм** - Pre-built templates
4. **Аналитика и отчеты** - Insights по проектам
### Низкие улучшения:
1. **Mobile app** - iOS/Android приложения
2. **Интеграции** - Slack, Teams, Jira и др.
3. **API для плагинов** - Расширяемость системы
## Приоритизированный план исправления
| Приоритет | Проблема | Файлы | Трудоёмкость |
|-----------|----------|-------|--------------|
| **Critical** | XSS уязвимости | `internal/handlers/*.go` | 3 дня |
| **Critical** | Хранение JWT в localStorage | `src/app/core/auth/*.ts` | 1 день |
| **Critical** | Небезопасное хранение refresh токенов | `internal/utils/password.go` | 1 день |
| **High** | Rate limiting middleware | `internal/middleware/` | 2 дня |
| **High** | CSRF protection | `internal/middleware/`, `src/app/core/auth/` | 2 дня |
| **High** | Валидация входных данных | `internal/handlers/`, `internal/utils/` | 3 дня |
| **Medium** | Оптимизация запросов БД | `internal/repository/` | 2 дня |
| **Medium** | Структурированное логирование | `internal/handlers/` | 1 день |
| **Low** | CSP заголовки | `src/index.html`, конфигурация сервера | 1 день |
| **Low** | A11y улучшения | `src/app/components/` | 3 дня |
### Общая оценка:
- **Critical issues:** 6 задач, 8 дней
- **High issues:** 5 задач, 7 дней
- **Medium issues:** 3 задачи, 6 дней
- **Low issues:** 4 задачи, 5 дней
**Общая трудоёмкость:** 26 дней разработки + 3 дня на тестирование = 29 дней
### Рекомендуемый порядок работы:
1. **Неделя 1:** Решение всех critical проблем (безопасность)
2. **Неделя 2:** High приоритетные улучшения (защита)
3. **Неделя 3:** Medium и Low улучшения (качество и UX)
**Примечание:** Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.