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

384 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔍 АУДИТ БЕЗОПАСНОСТИ АРХИТЕКТУРЫ КАБИНЕТОВ SFERA
> **Дата:** 2025-09-19
> **Статус:** В процессе
> **Цель:** Глубокая диагностика архитектуры кабинетов, поиск уязвимостей и багов
---
## 📊 ОБЩАЯ СТАТИСТИКА СИСТЕМЫ
### СТРУКТУРА КАБИНЕТОВ
**Всего страниц в системе:** 94 страницы
- `/app/fulfillment/`: 18 страниц
- `/app/seller/`: 10 страниц
- `/app/wholesale/`: 9 страниц
- `/app/logistics/`: 9 страниц
- Общие страницы: 48+ страниц
**Защита страниц:**
-**Страниц с `useRoleGuard`:** 55 файлов (роль-специфичная защита)
-**Страниц с `AuthGuard`:** 73+ файла (базовая авторизация)
-**Незащищенных страниц:** ~39 страниц
---
## 🚨 КРИТИЧЕСКИЕ УЯЗВИМОСТИ
### 1. ГЛОБАЛЬНЫЕ СТРАНИЦЫ БЕЗ РОЛЬ-СПЕЦИФИЧНОЙ ЗАЩИТЫ
**Проблема:** Существуют глобальные маршруты, доступные всем авторизованным пользователям.
**Критические незащищенные глобальные страницы:**
```typescript
/economics/page.tsx только AuthGuard (любая роль может зайти)
/market/page.tsx только AuthGuard (любая роль может зайти)
/partners/page.tsx только AuthGuard (любая роль может зайти)
/messenger/page.tsx только AuthGuard (любая роль может зайти)
```
**Риски:**
- Пользователь SELLER может получить доступ к данным FULFILLMENT через `/economics/`
- Логисты могут просматривать партнеров поставщиков через `/partners/`
- Полное отсутствие изоляции на глобальном уровне
### 2. ДУБЛИРОВАНИЕ МАРШРУТОВ С РАЗНОЙ ЛОГИКОЙ БЕЗОПАСНОСТИ
**Проблема:** Один и тот же функционал доступен через разные маршруты с разными уровнями защиты.
**Сравнение защиты:**
```typescript
// ГЛОБАЛЬНЫЕ (только 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`:**
```typescript
// НЕ ЗАЩИЩЕНЫ:
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`)**
```typescript
// ✅ ПОЛОЖИТЕЛЬНЫЕ АСПЕКТЫ:
- Проверяет базовую авторизацию (isAuthenticated)
- Проверяет наличие организации у пользователя
- Перенаправляет неавторизованных на /register
// ❌ НЕДОСТАТКИ:
- НЕ проверяет соответствие роли и страницы
- Позволяет SELLER заходить на страницы FULFILLMENT
```
**2. useRoleGuard Hook (`/src/hooks/useRoleGuard.ts`)**
```typescript
// ✅ ПОЛОЖИТЕЛЬНЫЕ АСПЕКТЫ:
- Проверяет соответствие роли пользователя требуемой роли
- Автоматически перенаправляет в правильный кабинет
- Умный редирект на основе типа организации
// ❌ НЕДОСТАТКИ:
- Используется только в 55 из 94 страниц
- Отсутствует в критических компонентах
```
**3. GraphQL Security Layer (`/src/graphql/security/`)**
```typescript
// ✅ СИЛЬНЫЕ СТОРОНЫ:
- Комплексная система фильтрации данных
- Аудит доступа к коммерческим данным
- Изоляция данных между участниками
- Автоматическое логирование подозрительной активности
// ⚠️ ВОПРОСЫ:
- Многие компоненты отключены (middleware, secure-resolver)
- Зависит от переменных окружения
- Частично протестирована система
```
---
## 🛡️ РЕКОМЕНДАЦИИ ПО УСТРАНЕНИЮ
### ПРИОРИТЕТ 1: КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ
**1. Добавить useRoleGuard во все роль-специфичные компоненты**
```typescript
// Пример для MessengerDashboard
export function MessengerDashboard() {
useRoleGuard('SELLER') // ИЛИ определить динамически
// ... rest of component
}
```
**2. Провести аудит глобальных маршрутов**
- Определить какие глобальные страницы нужны
- Удалить дубликаты или добавить роль-специфичную защиту
- Создать единую политику доступа
**3. Активировать отключенные компоненты безопасности**
```typescript
// В src/graphql/security/index.ts
// ВКЛЮЧИТЬ:
export { createSecureResolver, SecurityHelpers } from './secure-resolver'
export { applySecurityMiddleware } from './middleware'
```
### ПРИОРИТЕТ 2: АРХИТЕКТУРНЫЕ УЛУЧШЕНИЯ
**1. Создать универсальный роль-гард**
```typescript
// Новый компонент: RoleBasedGuard
interface RoleBasedGuardProps {
allowedRoles: OrganizationType[]
children: React.ReactNode
fallback?: React.ReactNode
}
```
**2. Реализовать автоматическую защиту маршрутов**
```typescript
// Layout-уровневая защита
export default function CabinetLayout({
children,
requiredRole
}: {
children: React.ReactNode
requiredRole: OrganizationType
}) {
useRoleGuard(requiredRole)
return <>{children}</>
}
```
**3. Создать единую карту доступов**
```typescript
// 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`:
```typescript
// Пример из 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` - аудит доступа к коммерческим данным
- Автоматическое логирование подозрительной активности
### ПРОБЛЕМНЫЕ ОБЛАСТИ
**❌ Отключенные компоненты безопасности:**
```typescript
// В 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)
```
**⚠️ Зависимость от переменных окружения:**
```typescript
export function isSecurityEnabled(): boolean {
return process.env.ENABLE_SUPPLY_SECURITY === 'true'
}
```
---
## 📋 ФИНАЛЬНЫЕ РЕКОМЕНДАЦИИ
### КРИТИЧНОСТЬ: ВЫСОКАЯ 🔴
**1. НЕМЕДЛЕННЫЕ ДЕЙСТВИЯ (Сегодня)**
```bash
# Добавить 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** - Требуются немедленные исправления
**Статус аудита:****ЗАВЕРШЕН** - Обнаружены критические уязвимости, план исправлений готов