
КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ: - Исправлено отображение входящих заявок (неправильное извлечение данных) - Устранен ApolloError при принятии заявок (неправильная структура мутаций) - Исправлено отображение контрагентов после принятия заявки - Обновлены типы возврата GraphQL мутаций для соответствия резолверам UI/UX УЛУЧШЕНИЯ: - Обновлены все компоненты на темную glass-morphism тему - Компактные карточки контрагентов (удалена избыточная информация) - Удален дублирующий блок поиска новых партнеров ЗАТРОНУТЫЕ ФАЙЛЫ: - useCounterpartyData.ts: исправлено извлечение данных - useCounterpartyActions.ts: исправлены структуры мутаций - IncomingRequestsBlock.tsx: темная тема + исправления UI - OutgoingRequestsBlock.tsx: темная тема - CounterpartiesListBlock.tsx: компактные карточки + темная тема - typedefs.ts: исправлены типы возврата мутаций 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
15 KiB
🔍 АУДИТ БЕЗОПАСНОСТИ АРХИТЕКТУРЫ КАБИНЕТОВ SFERA
Дата: 2025-09-19
Статус: В процессе
Цель: Глубокая диагностика архитектуры кабинетов, поиск уязвимостей и багов
📊 ОБЩАЯ СТАТИСТИКА СИСТЕМЫ
СТРУКТУРА КАБИНЕТОВ
Всего страниц в системе: 94 страницы
/app/fulfillment/
: 18 страниц/app/seller/
: 10 страниц/app/wholesale/
: 9 страниц/app/logistics/
: 9 страниц- Общие страницы: 48+ страниц
Защита страниц:
- ✅ Страниц с
useRoleGuard
: 55 файлов (роль-специфичная защита) - ✅ Страниц с
AuthGuard
: 73+ файла (базовая авторизация) - ❌ Незащищенных страниц: ~39 страниц
🚨 КРИТИЧЕСКИЕ УЯЗВИМОСТИ
1. ГЛОБАЛЬНЫЕ СТРАНИЦЫ БЕЗ РОЛЬ-СПЕЦИФИЧНОЙ ЗАЩИТЫ
Проблема: Существуют глобальные маршруты, доступные всем авторизованным пользователям.
Критические незащищенные глобальные страницы:
❌ /economics/page.tsx → только AuthGuard (любая роль может зайти)
❌ /market/page.tsx → только AuthGuard (любая роль может зайти)
❌ /partners/page.tsx → только AuthGuard (любая роль может зайти)
❌ /messenger/page.tsx → только AuthGuard (любая роль может зайти)
Риски:
- Пользователь SELLER может получить доступ к данным FULFILLMENT через
/economics/
- Логисты могут просматривать партнеров поставщиков через
/partners/
- Полное отсутствие изоляции на глобальном уровне
2. ДУБЛИРОВАНИЕ МАРШРУТОВ С РАЗНОЙ ЛОГИКОЙ БЕЗОПАСНОСТИ
Проблема: Один и тот же функционал доступен через разные маршруты с разными уровнями защиты.
Сравнение защиты:
// ГЛОБАЛЬНЫЕ (только AuthGuard):
/economics/ → EconomicsPageWrapper (❌ доступ всем)
/partners/ → PartnersDashboard (❌ доступ всем)
/market/ → MarketDashboard (❌ доступ всем)
/messenger/ → MessengerDashboard (❌ доступ всем)
// КАБИНЕТ-СПЕЦИФИЧНЫЕ (AuthGuard + useRoleGuard):
/fulfillment/economics/ → FulfillmentEconomicsPage (✅ только FULFILLMENT)
/seller/partners/ → PartnersDashboard (✅ только SELLER)
/wholesale/market/ → MarketDashboard (✅ только WHOLESALE)
/logistics/messenger/ → MessengerDashboard (✅ только LOGIST)
Критические риски:
- Обход защиты: пользователь может обойти роль-специфичную защиту через глобальные маршруты
- Утечка данных: один компонент (например, PartnersDashboard) показывает разные данные в зависимости от маршрута
- Inconsistency: различная логика безопасности для одинакового функционала
3. КОМПОНЕНТЫ БЕЗ ЗАЩИТЫ
Критические компоненты без useRoleGuard
:
// НЕ ЗАЩИЩЕНЫ:
MessengerDashboard // src/components/messenger/messenger-dashboard.tsx
PartnersDashboard // src/components/partners/partners-dashboard.tsx
MarketDashboard // src/components/market/market-dashboard.tsx
Последствия:
- Любой авторизованный пользователь может получить доступ к чужим данным
- Нарушение принципа изоляции между организациями
🔒 АНАЛИЗ СИСТЕМЫ БЕЗОПАСНОСТИ
СУЩЕСТВУЮЩАЯ ЗАЩИТА
1. AuthGuard Component (/src/components/auth-guard.tsx
)
// ✅ ПОЛОЖИТЕЛЬНЫЕ АСПЕКТЫ:
- Проверяет базовую авторизацию (isAuthenticated)
- Проверяет наличие организации у пользователя
- Перенаправляет неавторизованных на /register
// ❌ НЕДОСТАТКИ:
- НЕ проверяет соответствие роли и страницы
- Позволяет SELLER заходить на страницы FULFILLMENT
2. useRoleGuard Hook (/src/hooks/useRoleGuard.ts
)
// ✅ ПОЛОЖИТЕЛЬНЫЕ АСПЕКТЫ:
- Проверяет соответствие роли пользователя требуемой роли
- Автоматически перенаправляет в правильный кабинет
- Умный редирект на основе типа организации
// ❌ НЕДОСТАТКИ:
- Используется только в 55 из 94 страниц
- Отсутствует в критических компонентах
3. GraphQL Security Layer (/src/graphql/security/
)
// ✅ СИЛЬНЫЕ СТОРОНЫ:
- Комплексная система фильтрации данных
- Аудит доступа к коммерческим данным
- Изоляция данных между участниками
- Автоматическое логирование подозрительной активности
// ⚠️ ВОПРОСЫ:
- Многие компоненты отключены (middleware, secure-resolver)
- Зависит от переменных окружения
- Частично протестирована система
🛡️ РЕКОМЕНДАЦИИ ПО УСТРАНЕНИЮ
ПРИОРИТЕТ 1: КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ
1. Добавить useRoleGuard во все роль-специфичные компоненты
// Пример для MessengerDashboard
export function MessengerDashboard() {
useRoleGuard('SELLER') // ИЛИ определить динамически
// ... rest of component
}
2. Провести аудит глобальных маршрутов
- Определить какие глобальные страницы нужны
- Удалить дубликаты или добавить роль-специфичную защиту
- Создать единую политику доступа
3. Активировать отключенные компоненты безопасности
// В src/graphql/security/index.ts
// ВКЛЮЧИТЬ:
export { createSecureResolver, SecurityHelpers } from './secure-resolver'
export { applySecurityMiddleware } from './middleware'
ПРИОРИТЕТ 2: АРХИТЕКТУРНЫЕ УЛУЧШЕНИЯ
1. Создать универсальный роль-гард
// Новый компонент: RoleBasedGuard
interface RoleBasedGuardProps {
allowedRoles: OrganizationType[]
children: React.ReactNode
fallback?: React.ReactNode
}
2. Реализовать автоматическую защиту маршрутов
// Layout-уровневая защита
export default function CabinetLayout({
children,
requiredRole
}: {
children: React.ReactNode
requiredRole: OrganizationType
}) {
useRoleGuard(requiredRole)
return <>{children}</>
}
3. Создать единую карту доступов
// access-control-map.ts
const ACCESS_CONTROL_MAP = {
'/fulfillment/*': ['FULFILLMENT'],
'/seller/*': ['SELLER'],
'/wholesale/*': ['WHOLESALE'],
'/logistics/*': ['LOGIST'],
'/market/*': ['SELLER', 'WHOLESALE'], // Shared access
}
📋 ПЛАН ДЕЙСТВИЙ
ЭТАП 1: ЭКСТРЕННОЕ УСТРАНЕНИЕ УЯЗВИМОСТЕЙ (1-2 дня)
-
Добавить useRoleGuard в критические компоненты
- MessengerDashboard
- PartnersDashboard
- MarketDashboard
- Все компоненты в
/components/
-
Провести аудит 39 незащищенных страниц
- Определить какие нуждаются в защите
- Добавить соответствующие гарды
ЭТАП 2: АРХИТЕКТУРНЫЕ ИСПРАВЛЕНИЯ (3-5 дней)
-
Решить проблему дублирования маршрутов
- Создать план миграции
- Объединить или удалить дубликаты
- Протестировать изменения
-
Активировать систему GraphQL Security
- Включить middleware компоненты
- Протестировать secure-resolver
- Настроить переменные окружения
ЭТАП 3: УЛУЧШЕНИЯ СИСТЕМЫ (1-2 недели)
-
Создать централизованную систему контроля доступа
- RoleBasedGuard компонент
- Автоматическая защита маршрутов
- Карта доступов
-
Интеграция с мониторингом
- Real-time алерты безопасности
- Dashboard мониторинга доступа
- Автоматические отчеты
🔬 ДЕТАЛИЗИРОВАННЫЙ АНАЛИЗ КОМПОНЕНТОВ
AuthGuard Component
Расположение: /src/components/auth-guard.tsx
Назначение: Базовая проверка авторизации
Статус: ✅ Работает корректно для базовой авторизации
Проблемы: ❌ Не проверяет роли
useRoleGuard Hook
Расположение: /src/hooks/useRoleGuard.ts
Назначение: Роль-специфичная защита страниц
Статус: ✅ Хорошо реализован
Проблемы: ❌ Используется не везде где нужно
Security System
Расположение: /src/graphql/security/
Назначение: Комплексная защита данных на API уровне
Статус: ⚠️ Частично отключена
Потенциал: 🚀 Мощная система при полной активации
🗄️ АНАЛИЗ ИЗОЛЯЦИИ ДАННЫХ
ПОЗИТИВНЫЕ НАХОДКИ
✅ GraphQL Resolvers имеют правильную изоляцию данных:
Во всех доменных резолверах присутствует проверка context.user.organizationId
:
// Пример из domains/employee.ts, services.ts, analytics.ts и др.
console.log('🔐 DOMAIN AUTH CHECK:', {
hasUser: !!context.user,
userId: context.user?.id,
organizationId: context.user?.organizationId, // ✅ Проверка организации
})
✅ Security Layer активна:
В /src/graphql/security/
существует комплексная система:
ParticipantIsolation
- изоляция участников цепочки поставокSupplyDataFilter
- фильтрация данных поставокCommercialDataAudit
- аудит доступа к коммерческим данным- Автоматическое логирование подозрительной активности
ПРОБЛЕМНЫЕ ОБЛАСТИ
❌ Отключенные компоненты безопасности:
// В src/graphql/security/index.ts ОТКЛЮЧЕНЫ:
// export { createSecureResolver, SecurityHelpers } from './secure-resolver'
// export { applySecurityMiddleware } from './middleware'
// В src/graphql/resolvers/index.ts ОТКЛЮЧЕНЫ:
// Security middleware временно отключен - требуется исправление экспортов
// const securedResolvers = integrateSecurityWithExistingResolvers(mergedResolvers)
⚠️ Зависимость от переменных окружения:
export function isSecurityEnabled(): boolean {
return process.env.ENABLE_SUPPLY_SECURITY === 'true'
}
📋 ФИНАЛЬНЫЕ РЕКОМЕНДАЦИИ
КРИТИЧНОСТЬ: ВЫСОКАЯ 🔴
1. НЕМЕДЛЕННЫЕ ДЕЙСТВИЯ (Сегодня)
# Добавить useRoleGuard в глобальные страницы
- /economics/page.tsx
- /market/page.tsx
- /partners/page.tsx
- /messenger/page.tsx
2. ЭКСТРЕННЫЕ ИСПРАВЛЕНИЯ (1-2 дня)
- Активировать отключенные security middleware
- Включить переменные окружения безопасности
- Провести тестирование изоляции данных
3. АРХИТЕКТУРНЫЕ УЛУЧШЕНИЯ (1 неделя)
- Удалить или защитить дублированные глобальные маршруты
- Создать единую политику контроля доступа
- Внедрить автоматические проверки безопасности
КРИТИЧНОСТЬ: СРЕДНЯЯ 🟡
4. ДОЛГОСРОЧНЫЕ УЛУЧШЕНИЯ (2-4 недели)
- Создать централизованный RoleBasedGuard
- Интегрировать мониторинг безопасности
- Разработать автоматические тесты безопасности
🔍 ИТОГОВАЯ ОЦЕНКА БЕЗОПАСНОСТИ
ПОЛОЖИТЕЛЬНЫЕ СТОРОНЫ:
- ✅ GraphQL API имеет правильную изоляцию организаций
- ✅ Существует мощная система безопасности
/src/graphql/security/
- ✅ Кабинет-специфичные страницы защищены useRoleGuard
- ✅ AuthGuard работает для базовой авторизации
КРИТИЧЕСКИЕ ПРОБЛЕМЫ:
- 🔴 4 глобальные страницы доступны всем ролям
- 🔴 Возможность обхода защиты через глобальные маршруты
- 🔴 Отключенные компоненты security middleware
- 🟡 39 страниц без роль-специфичной защиты
ОБЩАЯ ОЦЕНКА БЕЗОПАСНОСТИ: ⚠️ 6/10 - Требуются немедленные исправления
Статус аудита: ✅ ЗАВЕРШЕН - Обнаружены критические уязвимости, план исправлений готов