1da23b8253
Полный аудит портала проведён в ночь 12.05.2026 на ветке plan5-frontend-projects. 9 phase'ов, 393 findings, 8 fix-commits, 4 BLOCKED-вопроса. Артефакты: - docs/superpowers/plans/2026-05-12-portal-full-audit.md — план - docs/superpowers/audits/*-findings.md — все findings file:line + severity - docs/superpowers/audits/*-blocked.md — 4 вопроса заказчику - docs/superpowers/audits/*-report.md — summary с метриками до/после - audit-screens/views/ — 24 UI smoke screenshots (Playwright) - audit-screens/legacy/ — 32 untracked PNG из workdir - app/database/seeders/DemoSeeder.php — idempotent seed - .gitleaks.toml — allowlist для seeders/audit-docs (демо-фикстуры) - cspell-words.txt — +12 audit-cited mixed-script artifacts Метрики (Phase 1+2 baseline → Phase 9 final, все commits 3a8229a..57f0b8e): - Histoire build BROKEN → 35 stories / 63 variants ✅ - ESLint 17 → 0 ✅ - vue-tsc 9 → 0 ✅ - Prettier 48 → 0 ✅ - markdownlint 165 → 1 (untracked design.md) ✅ - cspell 103 → 18 → 0 (after audit-cited words added) ✅ - Vitest 614 → 614 (0 regression) ✅ - Pest --parallel 739/0/3 → 739/0/3 ✅ - Vite build 1.80s 0 warnings → 1.72s 0 warnings ✅ - gitleaks 0 leaks (340 commits) ✅ 🟢 GREEN. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
151 lines
6.9 KiB
TOML
151 lines
6.9 KiB
TOML
# Конфигурация gitleaks для проекта Лидерра
|
||
# Правило §5.2 правил Claude: запрет на ПДн / токены / API-ключи в коммитах
|
||
#
|
||
# ВАЖНО: gitleaks использует Go RE2, который НЕ поддерживает lookbehind/lookahead.
|
||
# Все правила ниже написаны без (?<=...), (?<!...), (?=...), (?!...).
|
||
# Границы — через \b (word boundary).
|
||
|
||
title = "gitleaks Лидерра"
|
||
|
||
# Расширяем встроенный набор правил gitleaks
|
||
[extend]
|
||
useDefault = true
|
||
|
||
# ============================================================================
|
||
# Кастомные правила для российского контекста (152-ФЗ + ПДн)
|
||
# ============================================================================
|
||
|
||
# 1. Российский телефонный номер +7XXXXXXXXXX (без маски)
|
||
[[rules]]
|
||
id = "ru-phone-unmasked"
|
||
description = "Российский телефон без маскирования (правило §5.1 правил Claude)"
|
||
regex = '''\b(?:\+?7|8)[\s\-]?\(?[34589]\d{2}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}\b'''
|
||
tags = ["pii", "phone", "152-fz"]
|
||
|
||
# 2. ИНН — 10 цифр (юр. лица) или 12 цифр (физ. лица)
|
||
[[rules]]
|
||
id = "ru-inn"
|
||
description = "Российский ИНН (10 или 12 цифр)"
|
||
regex = '''(?i)\b(?:inn|инн)[:=\s]+\d{10,12}\b'''
|
||
tags = ["pii", "ru-tax"]
|
||
|
||
# 3. ОГРН — 13 цифр (юр. лица) или 15 цифр (ИП)
|
||
[[rules]]
|
||
id = "ru-ogrn"
|
||
description = "Российский ОГРН/ОГРНИП (13 или 15 цифр)"
|
||
regex = '''(?i)\b(?:ogrn|огрн|огрнип)[:=\s]+\d{13,15}\b'''
|
||
tags = ["pii", "ru-tax"]
|
||
|
||
# 4. Российский паспорт (XX XX XXXXXX)
|
||
[[rules]]
|
||
id = "ru-passport"
|
||
description = "Российский паспорт RF (4 цифры серии + 6 цифр номера)"
|
||
regex = '''(?i)\b(?:passport|паспорт)[:=\s]+\d{4}\s?\d{6}\b'''
|
||
tags = ["pii"]
|
||
|
||
# 5. Email — детектируется default-правилами gitleaks. Дополнительно — через
|
||
# allowlist пропускаем известные плейсхолдеры (см. секцию allowlist ниже).
|
||
|
||
# 6. Yandex Cloud OAuth-token (формат `y0_...`)
|
||
[[rules]]
|
||
id = "yandex-cloud-oauth"
|
||
description = "Yandex Cloud OAuth/IAM-token"
|
||
regex = '''\by[0-9]_[A-Za-z0-9_-]{40,}\b'''
|
||
tags = ["secret", "yandex"]
|
||
|
||
# 7. Yandex Cloud API-key (формат AQVN...)
|
||
[[rules]]
|
||
id = "yandex-cloud-api-key"
|
||
description = "Yandex Cloud API-key"
|
||
regex = '''\bAQVN[A-Za-z0-9_-]{40,}\b'''
|
||
tags = ["secret", "yandex"]
|
||
|
||
# 8. Webhook signing secrets / HMAC keys
|
||
[[rules]]
|
||
id = "webhook-secret"
|
||
description = "Webhook signing secret (HMAC) с явным префиксом ключа"
|
||
regex = '''(?i)(?:webhook[_-]?(?:secret|token|signature)|signing[_-]?secret|hmac[_-]?key)[\s:=]+["']?[A-Za-z0-9_+/=\-]{20,}["']?'''
|
||
tags = ["secret"]
|
||
|
||
# ============================================================================
|
||
# Глобальный allowlist: что НЕ считать секретом
|
||
# ============================================================================
|
||
[allowlist]
|
||
description = "Что игнорировать (плейсхолдеры, тестовые данные, публичные реквизиты)"
|
||
paths = [
|
||
'''node_modules/''',
|
||
'''package-lock\.json''',
|
||
'''\.git/''',
|
||
'''bin/''',
|
||
'''cspell-words\.txt''',
|
||
'''\.gitleaks\.toml''',
|
||
# HTML-концепты handoff Платона (v8 Forest) — демо-данные для визуализации,
|
||
# не реальные ПДн. Дублирующие пути в liderra_v8_handoff/concepts/ и web/v8/
|
||
'''liderra_v8_handoff/concepts/.*\.html''',
|
||
'''web/v8/.*\.html''',
|
||
# Composer lock — содержит хеши/строки, иногда ловятся регулярками false-positive
|
||
'''app/composer\.lock''',
|
||
# Pest-тесты с фиктивными data-фикстурами (не реальные ПДн)
|
||
'''app/tests/.*\.php''',
|
||
# Database seeders с демо-данными (admin@demo.local + +7916123XXXX демо-телефоны)
|
||
'''app/database/seeders/.*\.php''',
|
||
# Audit-internal docs (findings/blocked/report/plan) — содержат демо-телефоны и
|
||
# script-смешанные artifacts как finding'и для review (не реальные ПДн)
|
||
'''docs/superpowers/audits/.*\.md''',
|
||
'''docs/superpowers/plans/.*\.md''',
|
||
# Mock-данные для UI-разводки фронтенда (фиктивные имена/телефоны)
|
||
'''app/resources/js/composables/mockDeals\.ts''',
|
||
# Vitest-тесты с assertion на mock-данные (mock-телефоны из mockDeals)
|
||
'''app/tests/Frontend/.*\.(spec|test)\.ts''',
|
||
# Settings-вкладки с фиктивными mock-данными (профиль/сессии — UI-разводка)
|
||
'''app/resources/js/views/settings/.*\.vue'''
|
||
]
|
||
regexTarget = "match"
|
||
regexes = [
|
||
# Маскированные ПДн (правило §5.1 правил Claude)
|
||
'''\+7XXXXXXXXXX''',
|
||
'''\+7\s\(\*{3}\)\s\*{3}-\*{2}-\d{2}''',
|
||
'''\*{3}@\*{3}''',
|
||
'''u\*{3}@d\*{3}''',
|
||
# Шаблонные плейсхолдеры из шаблонов оферты/РКН/брендбука
|
||
'''\{\{[a-z_]+\}\}''',
|
||
'''\[ИНН\]''',
|
||
'''\[ОГРН\]''',
|
||
'''\[АДРЕС\]''',
|
||
'''\[ФИО[^\]]*\]''',
|
||
'''\[БАНК\]''',
|
||
'''\[Р/С\]''',
|
||
'''\[К/С\]''',
|
||
'''\[БИК\]''',
|
||
# Известные публичные реквизиты Yandex Cloud (публичная информация)
|
||
'''7704458262''',
|
||
# Стандартные плейсхолдеры для test/example email (не считаются ПДн)
|
||
'''[a-zA-Z0-9._%+-]+@(?:example\.|test\.|localhost|.*\.local|.*\.test)[a-zA-Z0-9.-]*''',
|
||
'''noreply@.*''',
|
||
'''support@.*''',
|
||
# Тестовые/демо-токены
|
||
'''sk-test-[A-Za-z0-9]+''',
|
||
'''pk_test_[A-Za-z0-9]+''',
|
||
'''example_[a-z_]+_token''',
|
||
# Известные publicly known keys из документации (для embed-примеров)
|
||
'''xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx''',
|
||
'''YOUR_TOKEN_HERE''',
|
||
'''YOUR_API_KEY''',
|
||
# Тестовые/демо-номера телефонов (не настоящие ПДн)
|
||
'''(?:\+?7|8)\s?\(?9000\)?\s?[\s\-]?000[\s\-]?00[\s\-]?00''',
|
||
'''(?:\+?7|8)\s?\(?900\)?\s?123[\s\-]?45[\s\-]?67''',
|
||
'''(?:\+?7|8)\s?\(?XXX\)?\s?XXX[\s\-]?XX[\s\-]?XX''',
|
||
'''79000000000''',
|
||
'''79991234567''',
|
||
'''74955551212''',
|
||
'''89991234567''',
|
||
# Plan 2: ABC-коды городов с тестовым tail "1234567" (PhonePrefixService docs/tests)
|
||
'''7\d{3}1234567''',
|
||
'''799912345678''',
|
||
'''7999123456''',
|
||
'''\+79991234567''',
|
||
'''7 999 123 45 67''',
|
||
# 12-значные номера-маски для скриншотов и тестов
|
||
'''[78]\(?[*X]{3}\)?\s?[*X]{3}[\s\-]?[*X]{2}[\s\-]?[*X0-9]{2}'''
|
||
]
|