leadera audit

This commit is contained in:
Агальцов Антон
2026-03-30 07:51:20 +03:00
parent 20c2aae435
commit b36056a690
9 changed files with 740 additions and 372 deletions
+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">
File diff suppressed because one or more lines are too long
+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>