Files
sfera-new/2025-09-19/CABINET_ARCHITECTURE_SECURITY_AUDIT.md
Veronika Smirnova fe24b73634 fix: исправить критические ошибки системы партнерских заявок
КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ:
- Исправлено отображение входящих заявок (неправильное извлечение данных)
- Устранен 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>
2025-09-19 23:23:03 +03:00

15 KiB
Raw Blame History

🔍 АУДИТ БЕЗОПАСНОСТИ АРХИТЕКТУРЫ КАБИНЕТОВ 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 - Требуются немедленные исправления

Статус аудита: ЗАВЕРШЕН - Обнаружены критические уязвимости, план исправлений готов