leadera audit

This commit is contained in:
Агальцов Антон committed 2026-03-30 07:51:20 +03:00
1 parent 20c2aae435
commit b36056a690
9 files changed
+740 -372

No files matched your search

+190 -162
View File
@@ -6,210 +6,238 @@ tags: ["audit", "leadera", "security", "ux"]
## Обзор проекта
Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:
Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:
**Стек технологий:**
- **Бэкенд:** Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx
- **Фронтенд:** Angular (версия не указана), HttpClient
- **Инфраструктура:** Docker, PM2, Hugo для документации
### Бекенд
- **Стек:** Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT
- **Архитектура:** Clean Architecture с разделением на слои
- **Особенности:** RESTful API, автоматические миграции, система ролей через spaces
**Архитектура:**
- 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)
### Фронтенд
- **Стек:** Angular 21.1.3, Bootstrap 5, RxJS
- **Особенности:** JWT-аутентификация, перехватчики HTTP, lazy loading
## Бекенд — найденные проблемы
### 1. Критичные уязвимости
### Критические проблемы
#### 1.1 Отсутствие валидации ввода данных
**Критичность:** Critical
**Файл:** internal/dto/auth/login_request.go:5-6
**Описание:** В DTO используются базовые теги валидации (`binding:"required,email"`), но они не применяются в handlers. В handlers используется только `c.ShouldBindJSON()` без дополнительной валидации.
**Рекомендация:** Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).
#### 1. Уязвимость XSS в сериализации DOM
- **Файл:** `internal/handlers/space_handler.go:47-63`
- **Критичность:** **critical**
- **Описание:** В методе `GetSpaceMembers` используется `c.BindJSON(&req)` без валидации, что может привести к XSS при сериализации данных в JSON
- **Рекомендация:** Добавить валидацию DTO и использование HTML sanitizer
#### 1.2 Риск SQL-инъекций
**Критичность:** High
**Файл:** internal/repository/space_repository.go:68-73
**Описание:** В методе `GetBySlug` используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.
**Рекомендация:** Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.
#### 2. Небезопасное хранение токенов
- **Файл:** `internal/utils/password.go:19-21`
- **Критичность:** **critical**
- **Описание:** Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора
- **Рекомендация:** Перейти на bcrypt для хэширования refresh токенов
#### 1.3 Небезопасное хранение секретов
**Критичность:** High
**Файл:** internal/config/config.go:13-15
**Описание:** JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.
**Рекомендация:** Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.
#### 3. Отсутствие Rate Limiting
- **Файл:** Нет реализации
- **Критичность:** **high**
- **Описание:** Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак
- **Рекомендация:** Реализовать middleware для rate limiting
#### 1.4 Отсутствие ограничений на частоту запросов
**Критичность:** Medium
**Описание:** Нет защиты от brute force атак на аутентификацию.
**Рекомендация:** Реализовать rate limiting для эндпоинтов аутентификации.
### Высокие проблемы
### 2. Проблемы безопасности
#### 4. Отсутствие валидации входных данных
- **Файл:** `internal/handlers/auth_handler.go:26-32, 52-58`
- **Критичность:** **high**
- **Описание:** Нет строгой валидации email, длинны строк и других параметров запросов
- **Рекомендация:** Внедрить библиотеку для валидации (go-playground/validator)
#### 2.1 XSS валидация
**Критичность:** Medium
**Файл:** internal/handlers/space_handler.go
**Описание:** Нет очистки пользовательского ввода перед сохранением в базу данных.
**Рекомендация:** Добавить HTML экранирование пользовательских данных.
#### 5. Отсутствие защиты от CSRF
- **Файл:** Нет реализации
- **Критичность:** **high**
- **Описание:** Нет CSRF-токенов для POST/PUT/DELETE запросов
- **Рекомендация:** Реализовать CSRF middleware
#### 2.2 Отсутствие CSRF защиты
**Критичность:** Medium
**Файл:** internal/middleware/cors_middleware.go
**Описание:** Нет CSRF токенов или других механизмов защиты.
**Рекомендация:** Реализовать CSRF защиту для изменяющих операций.
#### 6. Потенциальные N+1 запросы
- **Файл:** `internal/repository/space_repository.go`
- **Критичность:** **high**
- **Описание:** Нет индексов и оптимизации для запросов с JOIN при получении членов spaces
- **Рекомендация:** Добавить правильные индексы и использовать eager loading
#### 2.3 Небезопасная обработка ошибок
**Критичность:** Medium
**Файл:**/internal/utils/response.go
**Описание:** Возвращаемые ошибки могут содержать внутренние детали реализации.
**Рекомендация:** Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.
### Средние проблемы
### 3. Архитектурные проблемы
#### 7. Отсутствие логирования ошибок
- **Файл:** `internal/handlers/gantt_handler.go:78-95`
- **Критичность:** **medium**
- **Описание:** Ошибки валидации не логируются, что затрудняет отладку
- **Рекомендация:** Структурированное логирование всех ошибок
#### 3.1 Отсутствие тестов
**Критичность:** Medium
**Файл:** Отсутствие тестовых файлов
**Описание:** Найден только один тестовый helper файл, нет unit и интеграционных тестов.
**Рекомендация:** Добавить покрытие тестами, особенно для критичных бизнес-логик.
#### 8. Жестко закодированные настройки
- **Файл:** `internal/middleware/space_middleware.go:121-128`
- **Критичность:** **medium**
- **Описание:** Статическая проверка subscription status без гибкой конфигурации
- **Рекомендация:** Вынести в конфигурацию возможные статусы подписки
#### 3.2 Отсутствие индексов в БД
**Критичность:** Medium
**Файл:** migrations/000001_create_users_table.up.sql:15-16
**Описание:** Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.
**Рекомендация:** Добавить индексы для часто используемых запросов.
#### 9. Отсутствие ограничений на количество записей
- **Файл:** `internal/handlers/gantt_handler.go`
- **Критичность:** **medium**
- **Описание:** Нет ограничений на количество задач, разделов или диаграмм на пользователя
- **Рекомендация:** Добавить лимиты через middleware
#### 3.3 Плохая обработка пагинации
**Критичность:** Medium
**Файл:** internal/repository/space_repository.go:39-45
**Описание:** Пагинация реализована, но нет валидации параметров page и per_page.
**Рекомендация:** Добавить валидацию и ограничение на максимальное количество элементов на страницу.
### Низкие проблемы
### 4. Проблемы конфигурации
#### 10. Отсутствие валидации для special символов
- **Файл:** `internal/utils/validation.go:21-24`
- **Критичность:** **low**
- **Описание:** Валидация паролей не включает некоторые специальные символы
- **Рекомендация:** Расширить список разрешенных символов
#### 4.1 Слабые настройки по умолчанию
**Критичность:** Medium
**Файл:** .env.example
**Описание:** JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.
**Рекомендация:** Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.
#### 4.2 Небезопасные настройки CORS
**Критичность:** Medium
**Файл:** .env.example
**Описание:** CORS разрешает любые origin в development.
**Рекомендация:** В продакшене использовать конкретные домены.
#### 11. Отсутствие Health Check для базы данных
- **Файл:** `internal/handlers/handler.go`
- **Критичность:** **low**
- **Описание:** Health endpoint не проверяет доступность базы данных
- **Рекомендация:** Добавить ping к базе данных в health check
## Фронтенд — найденные проблемы
### 1. Критичные уязвимости
### Критические проблемы
#### 1.1 Небезопасное хранение токенов
**Критичность:** Critical
**Файл:** src/app/core/auth/auth.service.ts:19-21
**Описание:** Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.
**Рекомендация:** Перенести токены в httpOnly cookie или secure storage.
#### 1. Хранение JWT токенов в localStorage
- **Файл:** `src/app/core/auth/auth.service.ts:25-40`
- **Критичность:** **critical**
- **Описание:** Токены хранятся в localStorage, уязвимом для XSS атак
- **Рекомендация:** Использовать HTTP-only cookies или secure storage
#### 1.2 Отсутствие валидации на клиенте
**Критичность:** Medium
**Файл:** src/app/core/auth/auth.models.ts
**Описание:** Нет валидации email, пароля и других полей на клиенте.
**Рекомендация:** Добавить клиентскую валидацию форм перед отправкой запросов.
#### 2. Отсутствие Content Security Policy (CSP)
- **Файл:** `src/index.html`
- **Критичность:** **critical**
- **Описание:** Нет заголовков CSP для защиты от XSS
- **Рекомендация:** Добавить заголовки CSP в HTTP ответы
### 2. Проблемы безопасности
### Высокие проблемы
#### 2.1 Отсутствие CSP
**Критичность:** Medium
**Описание:** Нет Content Security Policy для защиты от XSS и других атак.
**Рекомендация:** Добавить заголовки CSP с разрешенными источниками.
#### 3. Нет валидации форм на стороне клиента
- **Файл:** `src/app/pages/auth/components/sign-up/sign-up.component.ts`
- **Критичность:** **high**
- **Описание:** Формы не проходят полную валидацию перед отправкой
- **Рекомендация:** Реализовать полноценную клиентскую валидацию
#### 2.2 Нет ограничений на длину ввода
**Критичность:** Medium
**Описание:** Нет ограничения максимальной длины вводимых данных.
**Рекомендация:** Добавить maxlength атрибуты к input полям.
#### 4. Отсутствие обработки race conditions
- **Файл:** `src/app/core/auth/auth.interceptor.ts:15-45`
- **Критичность:** **high**
- **Описание:** Потенциальные race conditions при обновлении токенов
- **Рекомендация:** Реализовать очередь запросов при обновлении токенов
### 3. UX проблемы
#### 5. Нет ограничений на длину вводимых данных
- **Файл:** `src/app/components/forms/gantt-form.component.ts`
- **Критичность:** **high**
- **Описание:** Пользователь может вводить очень длинные тексты без ограничений
- **Рекомендация:** Добавить максимальную длину для полей ввода
#### 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 не всегда приводит к корректному перенаправлению.
**Рекомендация:** Стандартизовать обработку ошибок и отображение пользователю.
#### 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 интерфейс
## Безопасность
### Текущие меры безопасности
- Использование 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. **XSS уязвимости** - Отсутствие валидации входных данных на бэкенде
2. **Небезопасное хранение токенов** - Refresh токены используют SHA256 вместо bcrypt
3. **Отсутствие rate limiting** - Уязвимость для brute-force атак
4. **CSRF уязвимости** - Отсутствие CSRF-токенов
5. **Storage vulnerabilities** - localStorage используется для хранения JWT
### Рекомендации по безопасности
1. Реализовать rate limiting для аутентификации
2. Добавить CSRF защиту
3. Перенести JWT токены в httpOnly cookies
4. Реализовать систему мониторинга и оповещений о подозрительной активности
5. Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД)
6. Реализовать ротацию секретов
7. Добавить тесты безопасности
### Рекомендации по безопасности:
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. **Улучшить валидацию форм**: Добавить реальную-time валидацию и подсказки
2. **Добавить индикацию загрузки**: Skeleton loaders для всех асинхронных операций
3. **Улучшить обработку ошибок**: Пользовательские сообщения об ошибках с возможностью повторной попытки
4. **Добавить отключенные состояния**: Кнопки должны быть disabled во время загрузки
5. **Мобильная адаптация**: Проверка и улучшение мобильного UI
6. **Доступность**: Добавить ARIA labels и проверить доступность
### Критические улучшения:
### Бэкенд
1. **Улучшить пагинацию**: Добавить валидацию и лимиты
2. **Добавить bulk операции**: Оптимизировать массовые операции
3. **Улучшить обработку ошибок**: Более информативные сообщения
4. **Добавить метрики**: Время выполнения запросов, количество запросов
5. **Оптимизировать запросы**: Проверка на N+1 запросы
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** | Хранение 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 часа |
| **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 дня |
**Общая трудоёмкость:** ~31 час
**Рекомендуемый срок выполнения:** 2-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)
**Примечание:** Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.
+292 -12
View File
@@ -213,22 +213,302 @@
<div class="card-body">
<h3 class="card-title"><a href="../guides/leadera-audit/">Аудит Leadera</a></h3>
<p class="card-text"><h2 id="обзор-проекта">Обзор проекта</h2>
<p>Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:</p>
<p><strong>Стек технологий:</strong></p>
<p>Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:</p>
<h3 id="бекенд">Бекенд</h3>
<ul>
<li><strong>Бэкенд:</strong> Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx</li>
<li><strong>Фронтенд:</strong> Angular (версия не указана), HttpClient</li>
<li><strong>Инфраструктура:</strong> Docker, PM2, Hugo для документации</li>
<li><strong>Стек:</strong> Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT</li>
<li><strong>Архитектура:</strong> Clean Architecture с разделением на слои</li>
<li><strong>Особенности:</strong> RESTful API, автоматические миграции, система ролей через spaces</li>
</ul>
<p><strong>Архитектура:</strong></p>
<h3 id="фронтенд">Фронтенд</h3>
<ul>
<li>Clean Architecture с разделением на слои (handlers, service, repository)</li>
<li>RESTful API с использованием JWT для аутентификации</li>
<li>Управление правами доступа через RBAC (Role-Based Access Control)</li>
<li>Поддержка пространств (spaces) как основной изоляции данных</li>
<li>PostgreSQL с миграциями через golang-migrate</li>
<li><strong>Стек:</strong> Angular 21.1.3, Bootstrap 5, RxJS</li>
<li><strong>Особенности:</strong> JWT-аутентификация, перехватчики HTTP, lazy loading</li>
</ul>
<p><strong>Основные сущности:</strong></p></p>
<h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2>
<h3 id="критические-проблемы">Критические проблемы</h3>
<h4 id="1-уязвимость-xss-в-сериализации-dom">1. Уязвимость XSS в сериализации DOM</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/space_handler.go:47-63</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> В методе <code>GetSpaceMembers</code> используется <code>c.BindJSON(&amp;req)</code> без валидации, что может привести к XSS при сериализации данных в JSON</li>
<li><strong>Рекомендация:</strong> Добавить валидацию DTO и использование HTML sanitizer</li>
</ul>
<h4 id="2-небезопасное-хранение-токенов">2. Небезопасное хранение токенов</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/utils/password.go:19-21</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора</li>
<li><strong>Рекомендация:</strong> Перейти на bcrypt для хэширования refresh токенов</li>
</ul>
<h4 id="3-отсутствие-rate-limiting">3. Отсутствие Rate Limiting</h4>
<ul>
<li><strong>Файл:</strong> Нет реализации</li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак</li>
<li><strong>Рекомендация:</strong> Реализовать middleware для rate limiting</li>
</ul>
<h3 id="высокие-проблемы">Высокие проблемы</h3>
<h4 id="4-отсутствие-валидации-входных-данных">4. Отсутствие валидации входных данных</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/auth_handler.go:26-32, 52-58</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет строгой валидации email, длинны строк и других параметров запросов</li>
<li><strong>Рекомендация:</strong> Внедрить библиотеку для валидации (go-playground/validator)</li>
</ul>
<h4 id="5-отсутствие-защиты-от-csrf">5. Отсутствие защиты от CSRF</h4>
<ul>
<li><strong>Файл:</strong> Нет реализации</li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет CSRF-токенов для POST/PUT/DELETE запросов</li>
<li><strong>Рекомендация:</strong> Реализовать CSRF middleware</li>
</ul>
<h4 id="6-потенциальные-n1-запросы">6. Потенциальные N+1 запросы</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/repository/space_repository.go</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет индексов и оптимизации для запросов с JOIN при получении членов spaces</li>
<li><strong>Рекомендация:</strong> Добавить правильные индексы и использовать eager loading</li>
</ul>
<h3 id="средние-проблемы">Средние проблемы</h3>
<h4 id="7-отсутствие-логирования-ошибок">7. Отсутствие логирования ошибок</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go:78-95</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Ошибки валидации не логируются, что затрудняет отладку</li>
<li><strong>Рекомендация:</strong> Структурированное логирование всех ошибок</li>
</ul>
<h4 id="8-жестко-закодированные-настройки">8. Жестко закодированные настройки</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/middleware/space_middleware.go:121-128</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Статическая проверка subscription status без гибкой конфигурации</li>
<li><strong>Рекомендация:</strong> Вынести в конфигурацию возможные статусы подписки</li>
</ul>
<h4 id="9-отсутствие-ограничений-на-количество-записей">9. Отсутствие ограничений на количество записей</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет ограничений на количество задач, разделов или диаграмм на пользователя</li>
<li><strong>Рекомендация:</strong> Добавить лимиты через middleware</li>
</ul>
<h3 id="низкие-проблемы">Низкие проблемы</h3>
<h4 id="10-отсутствие-валидации-для-special-символов">10. Отсутствие валидации для special символов</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/utils/validation.go:21-24</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Валидация паролей не включает некоторые специальные символы</li>
<li><strong>Рекомендация:</strong> Расширить список разрешенных символов</li>
</ul>
<h4 id="11-отсутствие-health-check-для-базы-данных">11. Отсутствие Health Check для базы данных</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/handler.go</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Health endpoint не проверяет доступность базы данных</li>
<li><strong>Рекомендация:</strong> Добавить ping к базе данных в health check</li>
</ul>
<h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2>
<h3 id="критические-проблемы-1">Критические проблемы</h3>
<h4 id="1-хранение-jwt-токенов-в-localstorage">1. Хранение JWT токенов в localStorage</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.service.ts:25-40</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Токены хранятся в localStorage, уязвимом для XSS атак</li>
<li><strong>Рекомендация:</strong> Использовать HTTP-only cookies или secure storage</li>
</ul>
<h4 id="2-отсутствие-content-security-policy-csp">2. Отсутствие Content Security Policy (CSP)</h4>
<ul>
<li><strong>Файл:</strong> <code>src/index.html</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Нет заголовков CSP для защиты от XSS</li>
<li><strong>Рекомендация:</strong> Добавить заголовки CSP в HTTP ответы</li>
</ul>
<h3 id="высокие-проблемы-1">Высокие проблемы</h3>
<h4 id="3-нет-валидации-форм-на-стороне-клиента">3. Нет валидации форм на стороне клиента</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/pages/auth/components/sign-up/sign-up.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Формы не проходят полную валидацию перед отправкой</li>
<li><strong>Рекомендация:</strong> Реализовать полноценную клиентскую валидацию</li>
</ul>
<h4 id="4-отсутствие-обработки-race-conditions">4. Отсутствие обработки race conditions</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts:15-45</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Потенциальные race conditions при обновлении токенов</li>
<li><strong>Рекомендация:</strong> Реализовать очередь запросов при обновлении токенов</li>
</ul>
<h4 id="5-нет-ограничений-на-длину-вводимых-данных">5. Нет ограничений на длину вводимых данных</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/components/forms/gantt-form.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Пользователь может вводить очень длинные тексты без ограничений</li>
<li><strong>Рекомендация:</strong> Добавить максимальную длину для полей ввода</li>
</ul>
<h3 id="средние-проблемы-1">Средние проблемы</h3>
<h4 id="6-нет-proper-error-handling-states">6. Нет proper error handling states</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/layouts/components/navbar/navbar.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет graceful handling ошибок при загрузке данных</li>
<li><strong>Рекомендация:</strong> Реализовать skeleton loaders и error boundaries</li>
</ul>
<h4 id="7-плохая-производительность-при-большом-количестве-данных">7. Плохая производительность при большом количестве данных</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/pages/dashboard/gantt/gantt-page.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет virtual scrolling для больших списков задач</li>
<li><strong>Рекомендация:</strong> Реализовать virtual scrolling и lazy loading</li>
</ul>
<h4 id="8-отсутствие-a11y-для-некоторых-компонентов">8. Отсутствие a11y для некоторых компонентов</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/components/charts/gantt-chart/gantt-chart.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Гант-диаграмма не имеет proper ARIA labels</li>
<li><strong>Рекомендация:</strong> Добавить ARIA атрибуты и keyboard navigation</li>
</ul>
<h3 id="низкие-проблемы-1">Низкие проблемы</h3>
<h4 id="9-нет-csrf-protection">9. Нет CSRF protection</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Отсутствие CSRF токенов для чувствительных операций</li>
<li><strong>Рекомендация:</strong> Добавить CSRF токены в заголовки</li>
</ul>
<h4 id="10-плохая-мобильная-адаптация">10. Плохая мобильная адаптация</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/styles/gantt.scss</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Нет proper responsive design для мобильных устройств</li>
<li><strong>Рекомендация:</strong> Добавить медиа-запросы и touch-friendly интерфейс</li>
</ul>
<h2 id="безопасность">Безопасность</h2>
<h3 id="обнаруженные-уязвимости">Обнаруженные уязвимости:</h3>
<ol>
<li><strong>XSS уязвимости</strong> - Отсутствие валидации входных данных на бэкенде</li>
<li><strong>Небезопасное хранение токенов</strong> - Refresh токены используют SHA256 вместо bcrypt</li>
<li><strong>Отсутствие rate limiting</strong> - Уязвимость для brute-force атак</li>
<li><strong>CSRF уязвимости</strong> - Отсутствие CSRF-токенов</li>
<li><strong>Storage vulnerabilities</strong> - localStorage используется для хранения JWT</li>
</ol>
<h3 id="рекомендации-по-безопасности">Рекомендации по безопасности:</h3>
<ol>
<li>Реализовать Input Validation на всех уровнях</li>
<li>Перейти на HTTP-only cookies для токенов</li>
<li>Реализовать rate limiting middleware</li>
<li>Добавить CSRF protection</li>
<li>Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)</li>
<li>Реализовать proper logging и мониторинг</li>
<li>Добавить автоматические тесты безопасности</li>
</ol>
<h2 id="ux-улучшения">UX улучшения</h2>
<h3 id="критические-улучшения">Критические улучшения:</h3>
<ol>
<li><strong>Надежность аутентификации</strong> - Реализовать MFA</li>
<li><strong>Уведомления об ошибках</strong> - Лучшее error messaging</li>
<li><strong>Прогресс-бары</strong> - Для долгих операций</li>
</ol>
<h3 id="высокие-улучшения">Высокие улучшения:</h3>
<ol>
<li><strong>Поиск по проекту</strong> - Быстрый поиск across spaces</li>
<li><strong>Drag &amp; Drop</strong> - Для задач и диаграмм</li>
<li><strong>Keyboard shortcuts</strong> - Повышение продуктивности</li>
<li><strong>Темная тема</strong> - Улучшение UX при длительной работе</li>
</ol>
<h3 id="средние-улучшения">Средние улучшения:</h3>
<ol>
<li><strong>Экспорт данных</strong> -多种 форматы</li>
<li><strong>Коллаборация в реальном времени</strong> - WebSocket для live updates</li>
<li><strong>Шаблоны диаграмм</strong> - Pre-built templates</li>
<li><strong>Аналитика и отчеты</strong> - Insights по проектам</li>
</ol>
<h3 id="низкие-улучшения">Низкие улучшения:</h3>
<ol>
<li><strong>Mobile app</strong> - iOS/Android приложения</li>
<li><strong>Интеграции</strong> - Slack, Teams, Jira и др.</li>
<li><strong>API для плагинов</strong> - Расширяемость системы</li>
</ol>
<h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2>
<table>
<thead>
<tr>
<th>Приоритет</th>
<th>Проблема</th>
<th>Файлы</th>
<th>Трудоёмкость</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Critical</strong></td>
<td>XSS уязвимости</td>
<td><code>internal/handlers/*.go</code></td>
<td>3 дня</td>
</tr>
<tr>
<td><strong>Critical</strong></td>
<td>Хранение JWT в localStorage</td>
<td><code>src/app/core/auth/*.ts</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Critical</strong></td>
<td>Небезопасное хранение refresh токенов</td>
<td><code>internal/utils/password.go</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Rate limiting middleware</td>
<td><code>internal/middleware/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>CSRF protection</td>
<td><code>internal/middleware/</code>, <code>src/app/core/auth/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Валидация входных данных</td>
<td><code>internal/handlers/</code>, <code>internal/utils/</code></td>
<td>3 дня</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>Оптимизация запросов БД</td>
<td><code>internal/repository/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>Структурированное логирование</td>
<td><code>internal/handlers/</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>CSP заголовки</td>
<td><code>src/index.html</code>, конфигурация сервера</td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>A11y улучшения</td>
<td><code>src/app/components/</code></td>
<td>3 дня</td>
</tr>
</tbody>
</table>
<h3 id="общая-оценка">Общая оценка:</h3>
<ul>
<li><strong>Critical issues:</strong> 6 задач, 8 дней</li>
<li><strong>High issues:</strong> 5 задач, 7 дней</li>
<li><strong>Medium issues:</strong> 3 задачи, 6 дней</li>
<li><strong>Low issues:</strong> 4 задачи, 5 дней</li>
</ul>
<p><strong>Общая трудоёмкость:</strong> 26 дней разработки + 3 дня на тестирование = 29 дней</p></p>
<div class="tags">
+1 -1
View File
@@ -1 +1 @@
[{"content":"Обзор проекта Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:\nСтек технологий:\nБэкенд: Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx Фронтенд: Angular (версия не указана), HttpClient Инфраструктура: Docker, PM2, Hugo для документации Архитектура:\nClean Architecture с разделением на слои (handlers, service, repository) RESTful API с использованием JWT для аутентификации Управление правами доступа через RBAC (Role-Based Access Control) Поддержка пространств (spaces) как основной изоляции данных PostgreSQL с миграциями через golang-migrate Основные сущности:\nПользователи (Users) Пространства (Spaces) Диаграммы Ганта (Gantt Charts) Секции диаграмм (Gantt Sections) Задачи (Gantt Tasks) Бекенд — найденные проблемы 1. Критичные уязвимости 1.1 Отсутствие валидации ввода данных Критичность: Critical\nФайл: internal/dto/auth/login_request.go:5-6\nОписание: В DTO используются базовые теги валидации (binding:\u0026quot;required,email\u0026quot;), но они не применяются в handlers. В handlers используется только c.ShouldBindJSON() без дополнительной валидации.\nРекомендация: Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).\n1.2 Риск SQL-инъекций Критичность: High\nФайл: internal/repository/space_repository.go:68-73\nОписание: В методе GetBySlug используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.\nРекомендация: Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.\n1.3 Небезопасное хранение секретов Критичность: High\nФайл: internal/config/config.go:13-15\nОписание: JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.\nРекомендация: Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.\n1.4 Отсутствие ограничений на частоту запросов Критичность: Medium\nОписание: Нет защиты от brute force атак на аутентификацию.\nРекомендация: Реализовать rate limiting для эндпоинтов аутентификации.\n2. Проблемы безопасности 2.1 XSS валидация Критичность: Medium\nФайл: internal/handlers/space_handler.go\nОписание: Нет очистки пользовательского ввода перед сохранением в базу данных.\nРекомендация: Добавить HTML экранирование пользовательских данных.\n2.2 Отсутствие CSRF защиты Критичность: Medium\nФайл: internal/middleware/cors_middleware.go\nОписание: Нет CSRF токенов или других механизмов защиты.\nРекомендация: Реализовать CSRF защиту для изменяющих операций.\n2.3 Небезопасная обработка ошибок Критичность: Medium\nФайл:/internal/utils/response.go\nОписание: Возвращаемые ошибки могут содержать внутренние детали реализации.\nРекомендация: Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.\n3. Архитектурные проблемы 3.1 Отсутствие тестов Критичность: Medium\nФайл: Отсутствие тестовых файлов\nОписание: Найден только один тестовый helper файл, нет unit и интеграционных тестов.\nРекомендация: Добавить покрытие тестами, особенно для критичных бLine truncated
[{"content":"Обзор проекта Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:\nБекенд Стек: 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(\u0026amp;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 не проверяет доступность базы данных РекомендаLine truncated
+252 -192
View File
@@ -221,173 +221,220 @@
<h2 id="обзор-проекта">Обзор проекта</h2>
<p>Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:</p>
<p><strong>Стек технологий:</strong></p>
<p>Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:</p>
<h3 id="бекенд">Бекенд</h3>
<ul>
<li><strong>Бэкенд:</strong> Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx</li>
<li><strong>Фронтенд:</strong> Angular (версия не указана), HttpClient</li>
<li><strong>Инфраструктура:</strong> Docker, PM2, Hugo для документации</li>
<li><strong>Стек:</strong> Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT</li>
<li><strong>Архитектура:</strong> Clean Architecture с разделением на слои</li>
<li><strong>Особенности:</strong> RESTful API, автоматические миграции, система ролей через spaces</li>
</ul>
<p><strong>Архитектура:</strong></p>
<h3 id="фронтенд">Фронтенд</h3>
<ul>
<li>Clean Architecture с разделением на слои (handlers, service, repository)</li>
<li>RESTful API с использованием JWT для аутентификации</li>
<li>Управление правами доступа через RBAC (Role-Based Access Control)</li>
<li>Поддержка пространств (spaces) как основной изоляции данных</li>
<li>PostgreSQL с миграциями через golang-migrate</li>
</ul>
<p><strong>Основные сущности:</strong></p>
<ul>
<li>Пользователи (Users)</li>
<li>Пространства (Spaces)</li>
<li>Диаграммы Ганта (Gantt Charts)</li>
<li>Секции диаграмм (Gantt Sections)</li>
<li>Задачи (Gantt Tasks)</li>
<li><strong>Стек:</strong> Angular 21.1.3, Bootstrap 5, RxJS</li>
<li><strong>Особенности:</strong> JWT-аутентификация, перехватчики HTTP, lazy loading</li>
</ul>
<h2 id="бекенд--найденные-проблемы">Бекенд — найденные проблемы</h2>
<h3 id="1-критичные-уязвимости">1. Критичные уязвимости</h3>
<h4 id="11-отсутствие-валидации-ввода-данных">1.1 Отсутствие валидации ввода данных</h4>
<p><strong>Критичность:</strong> Critical<br>
<strong>Файл:</strong> internal/dto/auth/login_request.go:5-6<br>
<strong>Описание:</strong> В DTO используются базовые теги валидации (<code>binding:&quot;required,email&quot;</code>), но они не применяются в handlers. В handlers используется только <code>c.ShouldBindJSON()</code> без дополнительной валидации.<br>
<strong>Рекомендация:</strong> Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).</p>
<h4 id="12-риск-sql-инъекций">1.2 Риск SQL-инъекций</h4>
<p><strong>Критичность:</strong> High<br>
<strong>Файл:</strong> internal/repository/space_repository.go:68-73<br>
<strong>Описание:</strong> В методе <code>GetBySlug</code> используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.<br>
<strong>Рекомендация:</strong> Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.</p>
<h4 id="13-небезопасное-хранение-секретов">1.3 Небезопасное хранение секретов</h4>
<p><strong>Критичность:</strong> High<br>
<strong>Файл:</strong> internal/config/config.go:13-15<br>
<strong>Описание:</strong> JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.<br>
<strong>Рекомендация:</strong> Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.</p>
<h4 id="14-отсутствие-ограничений-на-частоту-запросов">1.4 Отсутствие ограничений на частоту запросов</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Описание:</strong> Нет защиты от brute force атак на аутентификацию.<br>
<strong>Рекомендация:</strong> Реализовать rate limiting для эндпоинтов аутентификации.</p>
<h3 id="2-проблемы-безопасности">2. Проблемы безопасности</h3>
<h4 id="21-xss-валидация">2.1 XSS валидация</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong> internal/handlers/space_handler.go<br>
<strong>Описание:</strong> Нет очистки пользовательского ввода перед сохранением в базу данных.<br>
<strong>Рекомендация:</strong> Добавить HTML экранирование пользовательских данных.</p>
<h4 id="22-отсутствие-csrf-защиты">2.2 Отсутствие CSRF защиты</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong> internal/middleware/cors_middleware.go<br>
<strong>Описание:</strong> Нет CSRF токенов или других механизмов защиты.<br>
<strong>Рекомендация:</strong> Реализовать CSRF защиту для изменяющих операций.</p>
<h4 id="23-небезопасная-обработка-ошибок">2.3 Небезопасная обработка ошибок</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong>/internal/utils/response.go<br>
<strong>Описание:</strong> Возвращаемые ошибки могут содержать внутренние детали реализации.<br>
<strong>Рекомендация:</strong> Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.</p>
<h3 id="3-архитектурные-проблемы">3. Архитектурные проблемы</h3>
<h4 id="31-отсутствие-тестов">3.1 Отсутствие тестов</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong> Отсутствие тестовых файлов<br>
<strong>Описание:</strong> Найден только один тестовый helper файл, нет unit и интеграционных тестов.<br>
<strong>Рекомендация:</strong> Добавить покрытие тестами, особенно для критичных бизнес-логик.</p>
<h4 id="32-отсутствие-индексов-в-бд">3.2 Отсутствие индексов в БД</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong> migrations/000001_create_users_table.up.sql:15-16<br>
<strong>Описание:</strong> Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.<br>
<strong>Рекомендация:</strong> Добавить индексы для часто используемых запросов.</p>
<h4 id="33-плохая-обработка-пагинации">3.3 Плохая обработка пагинации</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong> internal/repository/space_repository.go:39-45<br>
<strong>Описание:</strong> Пагинация реализована, но нет валидации параметров page и per_page.<br>
<strong>Рекомендация:</strong> Добавить валидацию и ограничение на максимальное количество элементов на страницу.</p>
<h3 id="4-проблемы-конфигурации">4. Проблемы конфигурации</h3>
<h4 id="41-слабые-настройки-по-умолчанию">4.1 Слабые настройки по умолчанию</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong> .env.example<br>
<strong>Описание:</strong> JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.<br>
<strong>Рекомендация:</strong> Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.</p>
<h4 id="42-небезопасные-настройки-cors">4.2 Небезопасные настройки CORS</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong> .env.example<br>
<strong>Описание:</strong> CORS разрешает любые origin в development.<br>
<strong>Рекомендация:</strong> В продакшене использовать конкретные домены.</p>
<h3 id="критические-проблемы">Критические проблемы</h3>
<h4 id="1-уязвимость-xss-в-сериализации-dom">1. Уязвимость XSS в сериализации DOM</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/space_handler.go:47-63</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> В методе <code>GetSpaceMembers</code> используется <code>c.BindJSON(&amp;req)</code> без валидации, что может привести к XSS при сериализации данных в JSON</li>
<li><strong>Рекомендация:</strong> Добавить валидацию DTO и использование HTML sanitizer</li>
</ul>
<h4 id="2-небезопасное-хранение-токенов">2. Небезопасное хранение токенов</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/utils/password.go:19-21</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора</li>
<li><strong>Рекомендация:</strong> Перейти на bcrypt для хэширования refresh токенов</li>
</ul>
<h4 id="3-отсутствие-rate-limiting">3. Отсутствие Rate Limiting</h4>
<ul>
<li><strong>Файл:</strong> Нет реализации</li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак</li>
<li><strong>Рекомендация:</strong> Реализовать middleware для rate limiting</li>
</ul>
<h3 id="высокие-проблемы">Высокие проблемы</h3>
<h4 id="4-отсутствие-валидации-входных-данных">4. Отсутствие валидации входных данных</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/auth_handler.go:26-32, 52-58</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет строгой валидации email, длинны строк и других параметров запросов</li>
<li><strong>Рекомендация:</strong> Внедрить библиотеку для валидации (go-playground/validator)</li>
</ul>
<h4 id="5-отсутствие-защиты-от-csrf">5. Отсутствие защиты от CSRF</h4>
<ul>
<li><strong>Файл:</strong> Нет реализации</li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет CSRF-токенов для POST/PUT/DELETE запросов</li>
<li><strong>Рекомендация:</strong> Реализовать CSRF middleware</li>
</ul>
<h4 id="6-потенциальные-n1-запросы">6. Потенциальные N+1 запросы</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/repository/space_repository.go</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Нет индексов и оптимизации для запросов с JOIN при получении членов spaces</li>
<li><strong>Рекомендация:</strong> Добавить правильные индексы и использовать eager loading</li>
</ul>
<h3 id="средние-проблемы">Средние проблемы</h3>
<h4 id="7-отсутствие-логирования-ошибок">7. Отсутствие логирования ошибок</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go:78-95</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Ошибки валидации не логируются, что затрудняет отладку</li>
<li><strong>Рекомендация:</strong> Структурированное логирование всех ошибок</li>
</ul>
<h4 id="8-жестко-закодированные-настройки">8. Жестко закодированные настройки</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/middleware/space_middleware.go:121-128</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Статическая проверка subscription status без гибкой конфигурации</li>
<li><strong>Рекомендация:</strong> Вынести в конфигурацию возможные статусы подписки</li>
</ul>
<h4 id="9-отсутствие-ограничений-на-количество-записей">9. Отсутствие ограничений на количество записей</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/gantt_handler.go</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет ограничений на количество задач, разделов или диаграмм на пользователя</li>
<li><strong>Рекомендация:</strong> Добавить лимиты через middleware</li>
</ul>
<h3 id="низкие-проблемы">Низкие проблемы</h3>
<h4 id="10-отсутствие-валидации-для-special-символов">10. Отсутствие валидации для special символов</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/utils/validation.go:21-24</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Валидация паролей не включает некоторые специальные символы</li>
<li><strong>Рекомендация:</strong> Расширить список разрешенных символов</li>
</ul>
<h4 id="11-отсутствие-health-check-для-базы-данных">11. Отсутствие Health Check для базы данных</h4>
<ul>
<li><strong>Файл:</strong> <code>internal/handlers/handler.go</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Health endpoint не проверяет доступность базы данных</li>
<li><strong>Рекомендация:</strong> Добавить ping к базе данных в health check</li>
</ul>
<h2 id="фронтенд--найденные-проблемы">Фронтенд — найденные проблемы</h2>
<h3 id="1-критичные-уязвимости-1">1. Критичные уязвимости</h3>
<h4 id="11-небезопасное-хранение-токенов">1.1 Небезопасное хранение токенов</h4>
<p><strong>Критичность:</strong> Critical<br>
<strong>Файл:</strong> src/app/core/auth/auth.service.ts:19-21<br>
<strong>Описание:</strong> Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.<br>
<strong>Рекомендация:</strong> Перенести токены в httpOnly cookie или secure storage.</p>
<h4 id="12-отсутствие-валидации-на-клиенте">1.2 Отсутствие валидации на клиенте</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Файл:</strong> src/app/core/auth/auth.models.ts<br>
<strong>Описание:</strong> Нет валидации email, пароля и других полей на клиенте.<br>
<strong>Рекомендация:</strong> Добавить клиентскую валидацию форм перед отправкой запросов.</p>
<h3 id="2-проблемы-безопасности-1">2. Проблемы безопасности</h3>
<h4 id="21-отсутствие-csp">2.1 Отсутствие CSP</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Описание:</strong> Нет Content Security Policy для защиты от XSS и других атак.<br>
<strong>Рекомендация:</strong> Добавить заголовки CSP с разрешенными источниками.</p>
<h4 id="22-нет-ограничений-на-длину-ввода">2.2 Нет ограничений на длину ввода</h4>
<p><strong>Критичность:</strong> Medium<br>
<strong>Описание:</strong> Нет ограничения максимальной длины вводимых данных.<br>
<strong>Рекомендация:</strong> Добавить maxlength атрибуты к input полям.</p>
<h3 id="3-ux-проблемы">3. UX проблемы</h3>
<h4 id="31-нет-индикации-загрузки">3.1 Нет индикации загрузки</h4>
<p><strong>Критичность:</strong> Low<br>
<strong>Файл:</strong> src/app/core/auth/auth.service.ts:45-47<br>
<strong>Описание:</strong> Для некоторых операций нет индикации загрузки.<br>
<strong>Рекомендация:</strong> Добавить skeleton loaders или spinners для всех асинхронных операций.</p>
<h4 id="32-плохая-обработка-ошибок">3.2 Плохая обработка ошибок</h4>
<p><strong>Критичность:</strong> Low<br>
<strong>Файл:</strong> src/app/core/auth/auth.interceptor.ts:28-32<br>
<strong>Описание:</strong> Обработка ошибок 401 не всегда приводит к корректному перенаправлению.<br>
<strong>Рекомендация:</strong> Стандартизовать обработку ошибок и отображение пользователю.</p>
<h3 id="критические-проблемы-1">Критические проблемы</h3>
<h4 id="1-хранение-jwt-токенов-в-localstorage">1. Хранение JWT токенов в localStorage</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.service.ts:25-40</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Токены хранятся в localStorage, уязвимом для XSS атак</li>
<li><strong>Рекомендация:</strong> Использовать HTTP-only cookies или secure storage</li>
</ul>
<h4 id="2-отсутствие-content-security-policy-csp">2. Отсутствие Content Security Policy (CSP)</h4>
<ul>
<li><strong>Файл:</strong> <code>src/index.html</code></li>
<li><strong>Критичность:</strong> <strong>critical</strong></li>
<li><strong>Описание:</strong> Нет заголовков CSP для защиты от XSS</li>
<li><strong>Рекомендация:</strong> Добавить заголовки CSP в HTTP ответы</li>
</ul>
<h3 id="высокие-проблемы-1">Высокие проблемы</h3>
<h4 id="3-нет-валидации-форм-на-стороне-клиента">3. Нет валидации форм на стороне клиента</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/pages/auth/components/sign-up/sign-up.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Формы не проходят полную валидацию перед отправкой</li>
<li><strong>Рекомендация:</strong> Реализовать полноценную клиентскую валидацию</li>
</ul>
<h4 id="4-отсутствие-обработки-race-conditions">4. Отсутствие обработки race conditions</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts:15-45</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Потенциальные race conditions при обновлении токенов</li>
<li><strong>Рекомендация:</strong> Реализовать очередь запросов при обновлении токенов</li>
</ul>
<h4 id="5-нет-ограничений-на-длину-вводимых-данных">5. Нет ограничений на длину вводимых данных</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/components/forms/gantt-form.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>high</strong></li>
<li><strong>Описание:</strong> Пользователь может вводить очень длинные тексты без ограничений</li>
<li><strong>Рекомендация:</strong> Добавить максимальную длину для полей ввода</li>
</ul>
<h3 id="средние-проблемы-1">Средние проблемы</h3>
<h4 id="6-нет-proper-error-handling-states">6. Нет proper error handling states</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/layouts/components/navbar/navbar.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет graceful handling ошибок при загрузке данных</li>
<li><strong>Рекомендация:</strong> Реализовать skeleton loaders и error boundaries</li>
</ul>
<h4 id="7-плохая-производительность-при-большом-количестве-данных">7. Плохая производительность при большом количестве данных</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/pages/dashboard/gantt/gantt-page.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Нет virtual scrolling для больших списков задач</li>
<li><strong>Рекомендация:</strong> Реализовать virtual scrolling и lazy loading</li>
</ul>
<h4 id="8-отсутствие-a11y-для-некоторых-компонентов">8. Отсутствие a11y для некоторых компонентов</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/components/charts/gantt-chart/gantt-chart.component.ts</code></li>
<li><strong>Критичность:</strong> <strong>medium</strong></li>
<li><strong>Описание:</strong> Гант-диаграмма не имеет proper ARIA labels</li>
<li><strong>Рекомендация:</strong> Добавить ARIA атрибуты и keyboard navigation</li>
</ul>
<h3 id="низкие-проблемы-1">Низкие проблемы</h3>
<h4 id="9-нет-csrf-protection">9. Нет CSRF protection</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/core/auth/auth.interceptor.ts</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Отсутствие CSRF токенов для чувствительных операций</li>
<li><strong>Рекомендация:</strong> Добавить CSRF токены в заголовки</li>
</ul>
<h4 id="10-плохая-мобильная-адаптация">10. Плохая мобильная адаптация</h4>
<ul>
<li><strong>Файл:</strong> <code>src/app/styles/gantt.scss</code></li>
<li><strong>Критичность:</strong> <strong>low</strong></li>
<li><strong>Описание:</strong> Нет proper responsive design для мобильных устройств</li>
<li><strong>Рекомендация:</strong> Добавить медиа-запросы и touch-friendly интерфейс</li>
</ul>
<h2 id="безопасность">Безопасность</h2>
<h3 id="текущие-меры-безопасности">Текущие меры безопасности</h3>
<ul>
<li>Использование JWT токенов для аутентификации</li>
<li>Параметризованные SQL запросы (защита от SQL инъекций)</li>
<li>CORS настройка</li>
<li>RBAC система через пространства и роли</li>
<li>Пароли хранятся в виде хешей</li>
<li>Refresh токены для управления сессиями</li>
</ul>
<h3 id="отсутствующие-меры">Отсутствующие меры</h3>
<ul>
<li>Rate limiting</li>
<li>CSRF protection</li>
<li>Content Security Policy</li>
<li>Input validation middleware</li>
<li>SQL injection protection for dynamic queries</li>
<li>XSS protection</li>
<li>Secure cookie storage</li>
<li>Brute force protection</li>
</ul>
<h3 id="рекомендации-по-безопасности">Рекомендации по безопасности</h3>
<h3 id="обнаруженные-уязвимости">Обнаруженные уязвимости:</h3>
<ol>
<li>Реализовать rate limiting для аутентификации</li>
<li>Добавить CSRF защиту</li>
<li>Перенести JWT токены в httpOnly cookies</li>
<li>Реализовать систему мониторинга и оповещений о подозрительной активности</li>
<li>Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД)</li>
<li>Реализовать ротацию секретов</li>
<li>Добавить тесты безопасности</li>
<li><strong>XSS уязвимости</strong> - Отсутствие валидации входных данных на бэкенде</li>
<li><strong>Небезопасное хранение токенов</strong> - Refresh токены используют SHA256 вместо bcrypt</li>
<li><strong>Отсутствие rate limiting</strong> - Уязвимость для brute-force атак</li>
<li><strong>CSRF уязвимости</strong> - Отсутствие CSRF-токенов</li>
<li><strong>Storage vulnerabilities</strong> - localStorage используется для хранения JWT</li>
</ol>
<h3 id="рекомендации-по-безопасности">Рекомендации по безопасности:</h3>
<ol>
<li>Реализовать Input Validation на всех уровнях</li>
<li>Перейти на HTTP-only cookies для токенов</li>
<li>Реализовать rate limiting middleware</li>
<li>Добавить CSRF protection</li>
<li>Внедрить заголовки безопасности (CSP, HSTS, X-Frame-Options)</li>
<li>Реализовать proper logging и мониторинг</li>
<li>Добавить автоматические тесты безопасности</li>
</ol>
<h2 id="ux-улучшения">UX улучшения</h2>
<h3 id="фронтенд">Фронтенд</h3>
<h3 id="критические-улучшения">Критические улучшения:</h3>
<ol>
<li><strong>Улучшить валидацию форм</strong>: Добавить реальную-time валидацию и подсказки</li>
<li><strong>Добавить индикацию загрузки</strong>: Skeleton loaders для всех асинхронных операций</li>
<li><strong>Улучшить обработку ошибок</strong>: Пользовательские сообщения об ошибках с возможностью повторной попытки</li>
<li><strong>Добавить отключенные состояния</strong>: Кнопки должны быть disabled во время загрузки</li>
<li><strong>Мобильная адаптация</strong>: Проверка и улучшение мобильного UI</li>
<li><strong>Доступность</strong>: Добавить ARIA labels и проверить доступность</li>
<li><strong>Надежность аутентификации</strong> - Реализовать MFA</li>
<li><strong>Уведомления об ошибках</strong> - Лучшее error messaging</li>
<li><strong>Прогресс-бары</strong> - Для долгих операций</li>
</ol>
<h3 id="бэкенд">Бэкенд</h3>
<h3 id="высокие-улучшения">Высокие улучшения:</h3>
<ol>
<li><strong>Улучшить пагинацию</strong>: Добавить валидацию и лимиты</li>
<li><strong>Добавить bulk операции</strong>: Оптимизировать массовые операции</li>
<li><strong>Улучшить обработку ошибок</strong>: Более информативные сообщения</li>
<li><strong>Добавить метрики</strong>: Время выполнения запросов, количество запросов</li>
<li><strong>Оптимизировать запросы</strong>: Проверка на N+1 запросы</li>
<li><strong>Поиск по проекту</strong> - Быстрый поиск across spaces</li>
<li><strong>Drag &amp; Drop</strong> - Для задач и диаграмм</li>
<li><strong>Keyboard shortcuts</strong> - Повышение продуктивности</li>
<li><strong>Темная тема</strong> - Улучшение UX при длительной работе</li>
</ol>
<h3 id="средние-улучшения">Средние улучшения:</h3>
<ol>
<li><strong>Экспорт данных</strong> -多种 форматы</li>
<li><strong>Коллаборация в реальном времени</strong> - WebSocket для live updates</li>
<li><strong>Шаблоны диаграмм</strong> - Pre-built templates</li>
<li><strong>Аналитика и отчеты</strong> - Insights по проектам</li>
</ol>
<h3 id="низкие-улучшения">Низкие улучшения:</h3>
<ol>
<li><strong>Mobile app</strong> - iOS/Android приложения</li>
<li><strong>Интеграции</strong> - Slack, Teams, Jira и др.</li>
<li><strong>API для плагинов</strong> - Расширяемость системы</li>
</ol>
<h2 id="приоритизированный-план-исправления">Приоритизированный план исправления</h2>
<table>
@@ -402,68 +449,81 @@
<tbody>
<tr>
<td><strong>Critical</strong></td>
<td>Хранение JWT токенов в localStorage</td>
<td>frontend/src/app/core/auth/auth.service.ts</td>
<td>2 часа</td>
<td>XSS уязвимости</td>
<td><code>internal/handlers/*.go</code></td>
<td>3 дня</td>
</tr>
<tr>
<td><strong>Critical</strong></td>
<td>Отсутствие валидации ввода данных</td>
<td>backend/internal/handlers/*.go</td>
<td>4 часа</td>
<td>Хранение JWT в localStorage</td>
<td><code>src/app/core/auth/*.ts</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Critical</strong></td>
<td>Небезопасное хранение refresh токенов</td>
<td><code>internal/utils/password.go</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Небезопасные настройки JWT</td>
<td>backend/internal/config/config.go</td>
<td>1 час</td>
<td>Rate limiting middleware</td>
<td><code>internal/middleware/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Rate limiting для аутентификации</td>
<td>backend/internal/middleware/</td>
<td>3 часа</td>
<td>CSRF protection</td>
<td><code>internal/middleware/</code>, <code>src/app/core/auth/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>High</strong></td>
<td>Валидация входных данных</td>
<td><code>internal/handlers/</code>, <code>internal/utils/</code></td>
<td>3 дня</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>Отсутствие тестов</td>
<td>backend/internal/</td>
<td>8 часов</td>
<td>Оптимизация запросов БД</td>
<td><code>internal/repository/</code></td>
<td>2 дня</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>XSS валидация</td>
<td>backend/internal/handlers/*.go</td>
<td>2 часа</td>
</tr>
<tr>
<td><strong>Medium</strong></td>
<td>CSRF защита</td>
<td>backend/internal/middleware/</td>
<td>2 часа</td>
<td>Структурированное логирование</td>
<td><code>internal/handlers/</code></td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>UX улучшения (индикация загрузки)</td>
<td>frontend/src/app/</td>
<td>3 часа</td>
<td>CSP заголовки</td>
<td><code>src/index.html</code>, конфигурация сервера</td>
<td>1 день</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>Оптимизация запросов</td>
<td>backend/internal/repository/</td>
<td>4 часа</td>
</tr>
<tr>
<td><strong>Low</strong></td>
<td>Документация API</td>
<td>backend/api/</td>
<td>2 часа</td>
<td>A11y улучшения</td>
<td><code>src/app/components/</code></td>
<td>3 дня</td>
</tr>
</tbody>
</table>
<p><strong>Общая трудоёмкость:</strong> ~31 час<br>
<strong>Рекомендуемый срок выполнения:</strong> 2-3 недели с учётом приоритетов</p>
<h3 id="общая-оценка">Общая оценка:</h3>
<ul>
<li><strong>Critical issues:</strong> 6 задач, 8 дней</li>
<li><strong>High issues:</strong> 5 задач, 7 дней</li>
<li><strong>Medium issues:</strong> 3 задачи, 6 дней</li>
<li><strong>Low issues:</strong> 4 задачи, 5 дней</li>
</ul>
<p><strong>Общая трудоёмкость:</strong> 26 дней разработки + 3 дня на тестирование = 29 дней</p>
<h3 id="рекомендуемый-порядок-работы">Рекомендуемый порядок работы:</h3>
<ol>
<li><strong>Неделя 1:</strong> Решение всех critical проблем (безопасность)</li>
<li><strong>Неделя 2:</strong> High приоритетные улучшения (защита)</li>
<li><strong>Неделя 3:</strong> Medium и Low улучшения (качество и UX)</li>
</ol>
<p><strong>Примечание:</strong> Этот аудит содержит только анализ и рекомендации. Не следует вносить изменения в код без дополнительных тестов и проверок безопасности.</p>
</div>
+1 -1
View File
@@ -1 +1 @@
[{"content":"Обзор проекта Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:\nСтек технологий:\nБэкенд: Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx Фронтенд: Angular (версия не указана), HttpClient Инфраструктура: Docker, PM2, Hugo для документации Архитектура:\nClean Architecture с разделением на слои (handlers, service, repository) RESTful API с использованием JWT для аутентификации Управление правами доступа через RBAC (Role-Based Access Control) Поддержка пространств (spaces) как основной изоляции данных PostgreSQL с миграциями через golang-migrate Основные сущности:\nПользователи (Users) Пространства (Spaces) Диаграммы Ганта (Gantt Charts) Секции диаграмм (Gantt Sections) Задачи (Gantt Tasks) Бекенд — найденные проблемы 1. Критичные уязвимости 1.1 Отсутствие валидации ввода данных Критичность: Critical\nФайл: internal/dto/auth/login_request.go:5-6\nОписание: В DTO используются базовые теги валидации (binding:\u0026quot;required,email\u0026quot;), но они не применяются в handlers. В handlers используется только c.ShouldBindJSON() без дополнительной валидации.\nРекомендация: Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).\n1.2 Риск SQL-инъекций Критичность: High\nФайл: internal/repository/space_repository.go:68-73\nОписание: В методе GetBySlug используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.\nРекомендация: Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.\n1.3 Небезопасное хранение секретов Критичность: High\nФайл: internal/config/config.go:13-15\nОписание: JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.\nРекомендация: Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.\n1.4 Отсутствие ограничений на частоту запросов Критичность: Medium\nОписание: Нет защиты от brute force атак на аутентификацию.\nРекомендация: Реализовать rate limiting для эндпоинтов аутентификации.\n2. Проблемы безопасности 2.1 XSS валидация Критичность: Medium\nФайл: internal/handlers/space_handler.go\nОписание: Нет очистки пользовательского ввода перед сохранением в базу данных.\nРекомендация: Добавить HTML экранирование пользовательских данных.\n2.2 Отсутствие CSRF защиты Критичность: Medium\nФайл: internal/middleware/cors_middleware.go\nОписание: Нет CSRF токенов или других механизмов защиты.\nРекомендация: Реализовать CSRF защиту для изменяющих операций.\n2.3 Небезопасная обработка ошибок Критичность: Medium\nФайл:/internal/utils/response.go\nОписание: Возвращаемые ошибки могут содержать внутренние детали реализации.\nРекомендация: Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.\n3. Архитектурные проблемы 3.1 Отсутствие тестов Критичность: Medium\nФайл: Отсутствие тестовых файлов\nОписание: Найден только один тестовый helper файл, нет unit и интеграционных тестов.\nРекомендация: Добавить покрытие тестами, особенно для критичных бLine truncated
[{"content":"Обзор проекта Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:\nБекенд Стек: 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(\u0026amp;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 не проверяет доступность базы данных РекомендаLine truncated
+1 -1
View File
@@ -13,7 +13,7 @@
<link>/guides/leadera-audit/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/guides/leadera-audit/</guid>
<description>&lt;h2 id=&#34;обзор-проекта&#34;&gt;Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Стек технологий:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Бэкенд:&lt;/strong&gt; Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Фронтенд:&lt;/strong&gt; Angular (версия не указана), HttpClient&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Инфраструктура:&lt;/strong&gt; Docker, PM2, Hugo для документации&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Архитектура:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Clean Architecture с разделением на слои (handlers, service, repository)&lt;/li&gt;&#xA;&lt;li&gt;RESTful API с использованием JWT для аутентификации&lt;/li&gt;&#xA;&lt;li&gt;Управление правами доступа через RBAC (Role-Based Access Control)&lt;/li&gt;&#xA;&lt;li&gt;Поддержка пространств (spaces) как основной изоляции данных&lt;/li&gt;&#xA;&lt;li&gt;PostgreSQL с миграциями через golang-migrate&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Основные сущности:&lt;/strong&gt;&lt;/p&gt;</description>
<description>&lt;h2 id=&#34;обзор-проекта&#34;&gt;Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:&lt;/p&gt;&#xA;&lt;h3 id=&#34;бекенд&#34;&gt;Бекенд&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Стек:&lt;/strong&gt; Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Архитектура:&lt;/strong&gt; Clean Architecture с разделением на слои&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Особенности:&lt;/strong&gt; RESTful API, автоматические миграции, система ролей через spaces&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;фронтенд&#34;&gt;Фронтенд&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Стек:&lt;/strong&gt; Angular 21.1.3, Bootstrap 5, RxJS&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Особенности:&lt;/strong&gt; JWT-аутентификация, перехватчики HTTP, lazy loading&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;бекенд--найденные-проблемы&#34;&gt;Бекенд — найденные проблемы&lt;/h2&gt;&#xA;&lt;h3 id=&#34;критические-проблемы&#34;&gt;Критические проблемы&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1-уязвимость-xss-в-сериализации-dom&#34;&gt;1. Уязвимость XSS в сериализации DOM&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/handlers/space_handler.go:47-63&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;critical&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; В методе &lt;code&gt;GetSpaceMembers&lt;/code&gt; используется &lt;code&gt;c.BindJSON(&amp;amp;req)&lt;/code&gt; без валидации, что может привести к XSS при сериализации данных в JSON&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Добавить валидацию DTO и использование HTML sanitizer&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;2-небезопасное-хранение-токенов&#34;&gt;2. Небезопасное хранение токенов&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/utils/password.go:19-21&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;critical&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Перейти на bcrypt для хэширования refresh токенов&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;3-отсутствие-rate-limiting&#34;&gt;3. Отсутствие Rate Limiting&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; Нет реализации&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;high&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Реализовать middleware для rate limiting&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;высокие-проблемы&#34;&gt;Высокие проблемы&lt;/h3&gt;&#xA;&lt;h4 id=&#34;4-отсутствие-валидации-входных-данных&#34;&gt;4. Отсутствие валидации входных данных&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/handlers/auth_handler.go:26-32, 52-58&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;high&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Нет строгой валидации email, длинны строк и других параметров запросов&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Внедрить библиотеку для валидации (go-playground/validator)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;5-отсутствие-защиты-от-csrf&#34;&gt;5. Отсутствие защиты от CSRF&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;Line truncated
</item>
</channel>
</rss>
+1 -1
View File
@@ -13,7 +13,7 @@
<link>/guides/leadera-audit/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/guides/leadera-audit/</guid>
<description>&lt;h2 id=&#34;обзор-проекта&#34;&gt;Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Стек технологий:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Бэкенд:&lt;/strong&gt; Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Фронтенд:&lt;/strong&gt; Angular (версия не указана), HttpClient&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Инфраструктура:&lt;/strong&gt; Docker, PM2, Hugo для документации&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Архитектура:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Clean Architecture с разделением на слои (handlers, service, repository)&lt;/li&gt;&#xA;&lt;li&gt;RESTful API с использованием JWT для аутентификации&lt;/li&gt;&#xA;&lt;li&gt;Управление правами доступа через RBAC (Role-Based Access Control)&lt;/li&gt;&#xA;&lt;li&gt;Поддержка пространств (spaces) как основной изоляции данных&lt;/li&gt;&#xA;&lt;li&gt;PostgreSQL с миграциями через golang-migrate&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Основные сущности:&lt;/strong&gt;&lt;/p&gt;</description>
<description>&lt;h2 id=&#34;обзор-проекта&#34;&gt;Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:&lt;/p&gt;&#xA;&lt;h3 id=&#34;бекенд&#34;&gt;Бекенд&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Стек:&lt;/strong&gt; Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Архитектура:&lt;/strong&gt; Clean Architecture с разделением на слои&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Особенности:&lt;/strong&gt; RESTful API, автоматические миграции, система ролей через spaces&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;фронтенд&#34;&gt;Фронтенд&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Стек:&lt;/strong&gt; Angular 21.1.3, Bootstrap 5, RxJS&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Особенности:&lt;/strong&gt; JWT-аутентификация, перехватчики HTTP, lazy loading&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;бекенд--найденные-проблемы&#34;&gt;Бекенд — найденные проблемы&lt;/h2&gt;&#xA;&lt;h3 id=&#34;критические-проблемы&#34;&gt;Критические проблемы&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1-уязвимость-xss-в-сериализации-dom&#34;&gt;1. Уязвимость XSS в сериализации DOM&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/handlers/space_handler.go:47-63&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;critical&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; В методе &lt;code&gt;GetSpaceMembers&lt;/code&gt; используется &lt;code&gt;c.BindJSON(&amp;amp;req)&lt;/code&gt; без валидации, что может привести к XSS при сериализации данных в JSON&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Добавить валидацию DTO и использование HTML sanitizer&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;2-небезопасное-хранение-токенов&#34;&gt;2. Небезопасное хранение токенов&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/utils/password.go:19-21&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;critical&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Перейти на bcrypt для хэширования refresh токенов&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;3-отсутствие-rate-limiting&#34;&gt;3. Отсутствие Rate Limiting&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; Нет реализации&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;high&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Реализовать middleware для rate limiting&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;высокие-проблемы&#34;&gt;Высокие проблемы&lt;/h3&gt;&#xA;&lt;h4 id=&#34;4-отсутствие-валидации-входных-данных&#34;&gt;4. Отсутствие валидации входных данных&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/handlers/auth_handler.go:26-32, 52-58&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;high&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Нет строгой валидации email, длинны строк и других параметров запросов&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Внедрить библиотеку для валидации (go-playground/validator)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;5-отсутствие-защиты-от-csrf&#34;&gt;5. Отсутствие защиты от CSRF&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;Line truncated
</item>
<item>
<title>Mac Studio — leadera-api БД (docker-compose)</title>
+1 -1
View File
@@ -13,7 +13,7 @@
<link>/guides/leadera-audit/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/guides/leadera-audit/</guid>
<description>&lt;h2 id=&#34;обзор-проекта&#34;&gt;Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Стек технологий:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Бэкенд:&lt;/strong&gt; Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Фронтенд:&lt;/strong&gt; Angular (версия не указана), HttpClient&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Инфраструктура:&lt;/strong&gt; Docker, PM2, Hugo для документации&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Архитектура:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Clean Architecture с разделением на слои (handlers, service, repository)&lt;/li&gt;&#xA;&lt;li&gt;RESTful API с использованием JWT для аутентификации&lt;/li&gt;&#xA;&lt;li&gt;Управление правами доступа через RBAC (Role-Based Access Control)&lt;/li&gt;&#xA;&lt;li&gt;Поддержка пространств (spaces) как основной изоляции данных&lt;/li&gt;&#xA;&lt;li&gt;PostgreSQL с миграциями через golang-migrate&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Основные сущности:&lt;/strong&gt;&lt;/p&gt;</description>
<description>&lt;h2 id=&#34;обзор-проекта&#34;&gt;Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:&lt;/p&gt;&#xA;&lt;h3 id=&#34;бекенд&#34;&gt;Бекенд&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Стек:&lt;/strong&gt; Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Архитектура:&lt;/strong&gt; Clean Architecture с разделением на слои&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Особенности:&lt;/strong&gt; RESTful API, автоматические миграции, система ролей через spaces&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;фронтенд&#34;&gt;Фронтенд&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Стек:&lt;/strong&gt; Angular 21.1.3, Bootstrap 5, RxJS&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Особенности:&lt;/strong&gt; JWT-аутентификация, перехватчики HTTP, lazy loading&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;бекенд--найденные-проблемы&#34;&gt;Бекенд — найденные проблемы&lt;/h2&gt;&#xA;&lt;h3 id=&#34;критические-проблемы&#34;&gt;Критические проблемы&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1-уязвимость-xss-в-сериализации-dom&#34;&gt;1. Уязвимость XSS в сериализации DOM&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/handlers/space_handler.go:47-63&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;critical&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; В методе &lt;code&gt;GetSpaceMembers&lt;/code&gt; используется &lt;code&gt;c.BindJSON(&amp;amp;req)&lt;/code&gt; без валидации, что может привести к XSS при сериализации данных в JSON&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Добавить валидацию DTO и использование HTML sanitizer&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;2-небезопасное-хранение-токенов&#34;&gt;2. Небезопасное хранение токенов&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/utils/password.go:19-21&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;critical&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Перейти на bcrypt для хэширования refresh токенов&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;3-отсутствие-rate-limiting&#34;&gt;3. Отсутствие Rate Limiting&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; Нет реализации&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;high&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Реализовать middleware для rate limiting&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;высокие-проблемы&#34;&gt;Высокие проблемы&lt;/h3&gt;&#xA;&lt;h4 id=&#34;4-отсутствие-валидации-входных-данных&#34;&gt;4. Отсутствие валидации входных данных&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/handlers/auth_handler.go:26-32, 52-58&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;high&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Нет строгой валидации email, длинны строк и других параметров запросов&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Внедрить библиотеку для валидации (go-playground/validator)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;5-отсутствие-защиты-от-csrf&#34;&gt;5. Отсутствие защиты от CSRF&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;Line truncated
</item>
</channel>
</rss>
+1 -1
View File
@@ -13,7 +13,7 @@
<link>/guides/leadera-audit/</link>
<pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
<guid>/guides/leadera-audit/</guid>
<description>&lt;h2 id=&#34;обзор-проекта&#34;&gt;Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Стек технологий:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Бэкенд:&lt;/strong&gt; Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Фронтенд:&lt;/strong&gt; Angular (версия не указана), HttpClient&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Инфраструктура:&lt;/strong&gt; Docker, PM2, Hugo для документации&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Архитектура:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Clean Architecture с разделением на слои (handlers, service, repository)&lt;/li&gt;&#xA;&lt;li&gt;RESTful API с использованием JWT для аутентификации&lt;/li&gt;&#xA;&lt;li&gt;Управление правами доступа через RBAC (Role-Based Access Control)&lt;/li&gt;&#xA;&lt;li&gt;Поддержка пространств (spaces) как основной изоляции данных&lt;/li&gt;&#xA;&lt;li&gt;PostgreSQL с миграциями через golang-migrate&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Основные сущности:&lt;/strong&gt;&lt;/p&gt;</description>
<description>&lt;h2 id=&#34;обзор-проекта&#34;&gt;Обзор проекта&lt;/h2&gt;&#xA;&lt;p&gt;Leadera — SaaS-система управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект разделен на два компонента:&lt;/p&gt;&#xA;&lt;h3 id=&#34;бекенд&#34;&gt;Бекенд&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Стек:&lt;/strong&gt; Go 1.21+, GIN, PostgreSQL 16+, pgx v5 + sqlx, JWT&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Архитектура:&lt;/strong&gt; Clean Architecture с разделением на слои&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Особенности:&lt;/strong&gt; RESTful API, автоматические миграции, система ролей через spaces&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;фронтенд&#34;&gt;Фронтенд&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Стек:&lt;/strong&gt; Angular 21.1.3, Bootstrap 5, RxJS&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Особенности:&lt;/strong&gt; JWT-аутентификация, перехватчики HTTP, lazy loading&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;бекенд--найденные-проблемы&#34;&gt;Бекенд — найденные проблемы&lt;/h2&gt;&#xA;&lt;h3 id=&#34;критические-проблемы&#34;&gt;Критические проблемы&lt;/h3&gt;&#xA;&lt;h4 id=&#34;1-уязвимость-xss-в-сериализации-dom&#34;&gt;1. Уязвимость XSS в сериализации DOM&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/handlers/space_handler.go:47-63&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;critical&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; В методе &lt;code&gt;GetSpaceMembers&lt;/code&gt; используется &lt;code&gt;c.BindJSON(&amp;amp;req)&lt;/code&gt; без валидации, что может привести к XSS при сериализации данных в JSON&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Добавить валидацию DTO и использование HTML sanitizer&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;2-небезопасное-хранение-токенов&#34;&gt;2. Небезопасное хранение токенов&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/utils/password.go:19-21&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;critical&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Refresh токены хэшируются с помощью SHA256 вместо bcrypt, что делает их уязвимыми для перебора&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Перейти на bcrypt для хэширования refresh токенов&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;3-отсутствие-rate-limiting&#34;&gt;3. Отсутствие Rate Limiting&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; Нет реализации&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;high&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Нет ограничений на количество запросов к API, что делает систему уязвимой для brute-force атак&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Реализовать middleware для rate limiting&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;высокие-проблемы&#34;&gt;Высокие проблемы&lt;/h3&gt;&#xA;&lt;h4 id=&#34;4-отсутствие-валидации-входных-данных&#34;&gt;4. Отсутствие валидации входных данных&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Файл:&lt;/strong&gt; &lt;code&gt;internal/handlers/auth_handler.go:26-32, 52-58&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Критичность:&lt;/strong&gt; &lt;strong&gt;high&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Нет строгой валидации email, длинны строк и других параметров запросов&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Рекомендация:&lt;/strong&gt; Внедрить библиотеку для валидации (go-playground/validator)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;5-отсутствие-защиты-от-csrf&#34;&gt;5. Отсутствие защиты от CSRF&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;Line truncated
</item>
</channel>
</rss>