
КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ: - Исправлено отображение входящих заявок (неправильное извлечение данных) - Устранен 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>
384 lines
15 KiB
Markdown
384 lines
15 KiB
Markdown
# 🔍 АУДИТ БЕЗОПАСНОСТИ АРХИТЕКТУРЫ КАБИНЕТОВ 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** - Требуются немедленные исправления
|
||
|
||
**Статус аудита:** ✅ **ЗАВЕРШЕН** - Обнаружены критические уязвимости, план исправлений готов
|