v2.0: исправлены критические баги, добавлены 4 новые проверки, 4-фазный cookie-аудит, retry-логика, YAML-словари, LLM-анализ, тесты

Исправлено:
- engine: _calculate_score() при ошибке загрузки (score не 100 для мёртвых сайтов)
- privacy_link: замена page.goto() на aiohttp (гонка данных)
- form_checkbox: 3-уровневый поиск label + dark-pattern detection
- server_location: синхронный urllib → aiohttp
- api/server: перепутанные request/response модели в batch
- main.py: csv --checks флаг
- engine: фазовая модель (cookie_audit отдельно, остальные параллельно)
- engine: retry-логика (3 попытки, exponential backoff)
- PDF: emoji заменены на текст (WeasyPrint)

Добавлено:
- consent_doc: проверка отдельного согласия на обработку ПД
- operator_info: проверка ИНН/ОГРН/DPO (читает главную + политику)
- cookie_audit: 4-фазный аудит (load→detect→reject→compare)
- llm_policy: опциональный LLM-анализ 16 разделов (--deep)
- external_scripts: YAML-словари trackers.yaml (critical/warning/russian)
- logging (output.py), .gitignore, pyproject.toml
- smoke-тесты (16/16)
This commit is contained in:
neo committed 2026-06-10 00:49:07 +05:00
1 parent 7fb417dad5
commit b9db935389
24 files changed
+1725 -286

No files matched your search

+346
View File
@@ -0,0 +1,346 @@
# 152-ФЗ Scanner: Стратегия эффективного compliance-сервиса
> Исследование проведено 10.06.2026. Проанализированы: 13 российских конкурентов,
> 4 международных open-source сканера, 5 чек-листов 152-ФЗ, технические best practices.
---
## 1. Рыночный контекст: почему сейчас
### 1.1. Ужесточение законодательства
| Дата | Изменение |
|------|-----------|
| 30.05.2025 | Штрафы ×10-20. Оборотные штрафы до 3% выручки, до 500 млн ₽ |
| 01.07.2025 | Запрет сбора ПД на зарубежных серверах — GA, reCAPTCHA, Google Fonts |
| 01.09.2025 | Согласие — отдельный документ. Нельзя включать в оферту |
| 11.12.2024 | Ст. 272.1 УК РФ — уголовная ответственность до 10 лет |
| 2026 | РКН: проактивный ИИ-мониторинг 24/7, 84% нарушений — автофиксация |
**Ключевое:** РКН перешёл от реактивной модели (жалобы) к проактивной (ИИ-мониторинг). 1000+ сайтов ежедневно. 83% проверенных сайтов имеют нарушения [1].
### 1.2. Размер рынка
- Каждый сайт с формой/аналитикой/cookies — оператор ПД
- Это 99% коммерческих сайтов в РФ
- Только отелей в Уфе: 50+ (протестировано в рамках 152-fz-scanner)
- Всего юрлиц в РФ: ~3 млн. Сайтов у них: ~500K+
---
## 2. Конкурентный анализ
### 2.1. Российские сканеры
| Сервис | Проверок | Цена | Фишки | Слабые места |
|--------|----------|------|-------|-------------|
| **Toolfox.ru** | 134 (11 законов) | Бесплатно | AI (Claude), PDF, баллы, ФЗ-53 | Закрытый, нет API |
| **scanetika.ru** | 38+ | Подписка | Мониторинг, 200K+ сайтов, B2B | Нет self-hosted |
| **EdLegal** | 21 | freemium | AI-анализ политики, расчёт штрафов | Мало проверок |
| **152-audit.ru** | ~15 | Бесплатно | Быстро, 3 мин | Базовый |
| **help152.ru** | 30+ законов | Бесплатно | Широкий охват | Слабый UI |
| **audit-pd.ru** | 15+ | Бесплатно | 30 сек | Базовый |
| **proverito.ru** | 16 | Бесплатно | Нейросеть, PDF | Мало проверок |
| **fzscan.ru** | ~10 | Бесплатно | 152 + 168 | Слабый |
| **reactortech.ru** | ~15 | Платно | Скриншоты, конкретика | Дорого |
| **nima-labs.ru** | ~12 | Платно | Генератор документов | Не сканер |
### 2.2. Международные open-source (GDPR)
| Проект | Правил | Технологии | Что можно заимствовать |
|--------|--------|-----------|----------------------|
| **ComplyTest** [2] | 70 (GDPR+WCAG+Security+DSA) | Node.js, Playwright, npx | CI/CD, SARIF, multi-format |
| **gdpr-cookie-scanner** [3] | 4D scoring | CLI, Playwright, Docker | 4-фазный скан, dark patterns |
| **GDPR Scanner** | ~10 | Python/Flask | Dashboard, scheduled scans |
| **EDPB Tool** | ~20 | EU official | Методология аудита |
| **LawCheck (РФ)** [4] | 152-ФЗ | FastAPI+Playwright+PostgreSQL+Redis+RQ | Архитектура, очереди |
### 2.3. Ниши без конкуренции
1. **API-first сканер** — все конкуренты form-based. Никто не даёт REST API для интеграции
2. **Self-hosted / on-premise** — LawCheck open-source, но без мониторинга и PDF
3. **White-label для агентств** — scanetika имеет B2B, но без white-label
4. **Пакетные проверки для хостингов/регистраторов** — не покрыто
5. **CI/CD интеграция** — для devops-команд (как ComplyTest, но для 152-ФЗ)
---
## 3. Полный список проверок для эффективного сканера
На основе синтеза чек-листов Reova (37 пунктов) [1], Proverito (16), EdLegal (21), Toolfox (134 включая смежные законы), LawCheck и международных best practices.
### 3.1. Категория A: Политика конфиденциальности (8 проверок)
| # | Проверка | Метод | Риск |
|---|----------|-------|------|
| A1 | Наличие страницы политики | Playwright: поиск ссылки → проверка 200 OK | HIGH |
| A2 | Доступность без авторизации | Проверка HTTP-статуса (не 401/403) | CRITICAL |
| A3 | Отдельная HTML-страница (не PDF) | Content-Type != application/pdf | HIGH |
| A4 | Ссылка в футере каждой страницы | DOM-анализ footer > a[href] | HIGH |
| A5 | Ссылка рядом с каждой формой | Поиск <form> → соседний <a> с политикой | HIGH |
| A6 | 16 обязательных разделов (LLM) | LLM-анализ текста политики: цели, категории, сроки, права, DPO, etc. | MEDIUM |
| A7 | Дата последнего обновления | Regex: дата в формате DD.MM.YYYY | MEDIUM |
| A8 | Реквизиты оператора (ИНН, адрес) | Regex ИНН (10/12 цифр) + сверка с ЕГРЮЛ | CRITICAL |
### 3.2. Категория B: Cookie-баннер и согласие (5 проверок)
| # | Проверка | Метод | Риск |
|---|----------|-------|------|
| B1 | Наличие баннера | CSS-селекторы + текстовые паттерны | HIGH |
| B2 | Баннер до установки tracking-cookies | 4-фазный метод (gdpr-cookie-scanner): загрузить без действий → посмотреть cookies | CRITICAL |
| B3 | Кнопка «Отказаться» (не только «Принять») | Dark-pattern detection: асимметрия кнопок | CRITICAL |
| B4 | Отказ отключает tracking-cookies | Фаза 3: нажать «Отказ» → проверить cookies | CRITICAL |
| B5 | Ссылка на политику в баннере | Поиск <a> внутри cookie-баннера | MEDIUM |
### 3.3. Категория C: Формы и чекбоксы (5 проверок)
| # | Проверка | Метод | Риск |
|---|----------|-------|------|
| C1 | Чекбокс в каждой форме | Поиск <form> → input[type=checkbox] | CRITICAL |
| C2 | Чекбокс НЕ предзаполнен | checked=false (dark pattern detection) | CRITICAL |
| C3 | Текст согласия содержит обязательные элементы | Regex: «согласие», «обработка», «персональные данные» + ссылка на политику | CRITICAL |
| C4 | Форма передаётся по HTTPS | Проверка form[action] → HTTPS | HIGH |
| C5 | Минимизация полей (только необходимые) | Подсчёт полей → оценка избыточности | MEDIUM |
### 3.4. Категория D: Сервер и инфраструктура (4 проверки)
| # | Проверка | Метод | Риск |
|---|----------|-------|------|
| D1 | Сервер в РФ | GeoIP: ip-api.com + ipapi.co (fallback) | CRITICAL |
| D2 | HTTPS / валидный SSL | Проверка сертификата (expiry, issuer) | CRITICAL |
| D3 | HSTS-заголовок | HTTP-ответ: Strict-Transport-Security | HIGH |
| D4 | CSP / X-Frame-Options | HTTP-заголовки безопасности | MEDIUM |
### 3.5. Категория E: Внешние скрипты и трекеры (7 проверок)
| # | Проверка | Метод | Риск |
|---|----------|-------|------|
| E1 | Google Analytics (запрещён) | Regex HTML: google-analytics.com | CRITICAL |
| E2 | Meta Pixel (запрещён) | Regex HTML: facebook.com/tr, connect.facebook.net | CRITICAL |
| E3 | Google reCAPTCHA (запрещена) | Regex: google.com/recaptcha | HIGH |
| E4 | Google Fonts CDN (IP утечка) | Regex: fonts.googleapis.com | HIGH |
| E5 | Яндекс.Метрика (допустима) | Regex: mc.yandex.ru | INFO |
| E6 | VK Pixel (допустим) | Regex: vk.com/rtrg | INFO |
| E7 | Прочие зарубежные трекеры | Словарь: Hotjar, Mixpanel, Amplitude, Segment, Clarity, etc. | HIGH |
### 3.6. Категория F: Права субъекта (3 проверки)
| # | Проверка | Метод | Риск |
|---|----------|-------|------|
| F1 | Механизм отзыва согласия | LLM: поиск в политике «отозвать согласие», «отказаться» | HIGH |
| F2 | Порядок удаления данных | LLM: поиск «удалить», «уничтожить», email/форма для запроса | HIGH |
| F3 | Контакты DPO (Data Protection Officer) | Regex: email/телефон + контекст «ответственный за ПД» | MEDIUM |
### 3.7. Категория G: Смежные законы (4 проверки)
| # | Проверка | Метод | Риск |
|---|----------|-------|------|
| G1 | Англицизмы в CTA (ФЗ-53) | Словарь «красных» слов: sale, click here, buy now, etc. | MEDIUM |
| G2 | Возрастная маркировка (436-ФЗ) | Поиск меток 0+/6+/12+/16+/18+ | MEDIUM |
| G3 | Реквизиты юрлица (ИНН/ОГРН) | Regex + сверка с ЕГРЮЛ | MEDIUM |
| G4 | Маркировка рекламы erid (ОРД) | Поиск erid в HTML | LOW |
**Итого: 36 проверок в 7 категориях** — покрытие основных требований 152-ФЗ + смежных законов.
---
## 4. Архитектура эффективного сканера
### 4.1. Ключевой принцип: 4 фазы как у gdpr-cookie-scanner [3]
```
Фаза 1: LOAD — загрузка без взаимодействия
→ Сохранить ВСЕ cookies и network requests ДО consent
→ Это baseline: что сайт ставит без согласия
Фаза 2: DETECT — поиск consent-механизма
→ CMP-селекторы → DOM-эвристики
→ Извлечь кнопки с visual properties (размер, цвет)
→ Dark-pattern detection: асимметрия, скрытая кнопка отказа
Фаза 3: REJECT — отказ и capture
→ Нажать «Отказаться»
→ Сравнить cookies с baseline
→ Что осталось после отказа? → нарушение
Фаза 4: ACCEPT — чистый браузер, принять
→ Новый контекст (нет cookies)
→ Принять согласие
→ Дельта cookies = что consent реально меняет
```
Это **принципиально сильнее** текущего подхода (просто поиск элемента на странице).
### 4.2. Архитектура правил (Rule Engine)
По образцу LawCheck [4] — YAML-словари вместо хардкода:
```yaml
# dictionaries/trackers.yaml
foreign_critical:
- domain: google-analytics.com
law: "152-ФЗ ст. 18 ч. 5"
fine: "до 6 млн ₽"
action: "Удалить, заменить на Yandex Metrica"
- domain: facebook.com/tr
law: "152-ФЗ ст. 12"
fine: "до 6 млн ₽"
action: "Удалить, заменить на VK Pixel"
foreign_warning:
- domain: fonts.googleapis.com
law: "152-ФЗ (IP-утечка)"
fine: "до 300 тыс ₽"
action: "Скачать и раздавать self-hosted"
russian_allowed:
- domain: mc.yandex.ru
- domain: vk.com/rtrg
```
**Преимущества:**
- Обновление правил без перекомпиляции
- Не-разработчики могут добавлять трекеры
- Аудит изменений через Git
### 4.3. Модульная архитектура
```
152-fz-scanner/
├── main.py # CLI (scan, csv, server)
├── scanner/
│ ├── engine.py # Оркестратор: 4-фазный скан + asyncio.gather
│ ├── models.py # Pydantic: CheckResult, SiteScan, Score
│ ├── rules_engine.py # YAML-движок: загрузка словарей, выполнение правил
│ └── checks/
│ ├── base.py # Abstract BaseCheck
│ ├── consent/ # B-проверки (cookie + consent)
│ │ ├── banner.py
│ │ └── dark_patterns.py
│ ├── forms/ # C-проверки
│ │ ├── checkbox.py
│ │ └── fields.py
│ ├── infrastructure/ # D-проверки
│ │ ├── server.py
│ │ └── headers.py
│ ├── policy/ # A-проверки
│ │ ├── presence.py
│ │ └── llm_analysis.py
│ ├── trackers/ # E-проверки
│ │ └── scripts.py
│ └── rights/ # F-проверки
│ └── subject.py
├── dictionaries/ # YAML-словари (правила без кода)
│ ├── trackers.yaml
│ ├── cookie_patterns.yaml
│ ├── consent_texts.yaml
│ └── anglicisms.yaml # Для ФЗ-53
├── api/
│ ├── server.py # FastAPI
│ ├── routes.py
│ └── schemas.py
├── reports/
│ ├── generator.py # PDF + HTML + JSON
│ └── templates/
│ ├── report.html.j2 # Для сайта
│ └── batch_report.html.j2 # Сводка для агентства
├── workers/ # Очередь для batch
│ └── queue.py # RQ/ARQ воркеры
├── tests/
│ ├── test_checks/
│ └── fixtures/
└── data/
├── input/ # CSV с URL
└── output/ # JSON + PDF
```
### 4.4. Технологический стек
| Компонент | Технология | Почему |
|-----------|-----------|--------|
| **Браузерная автоматизация** | Playwright (Python) | Стандарт индустрии: ComplyTest, LawCheck, gdpr-cookie-scanner |
| **API** | FastAPI + Pydantic v2 | Быстрый, async, авто-документация |
| **Очередь (batch)** | ARQ (async) или RQ | LawCheck использует RQ; ARQ — более современный async |
| **PDF** | WeasyPrint + Jinja2 | Уже работает; альтернатива — Playwright PDF |
| **LLM-анализ** | Qwen35B / Gemma4 (локально) | Анализ политики: 16 разделов, права субъекта |
| **GeoIP** | ip-api.com + ipapi.co (fallback) | Бесплатные API |
| **Хранение** | SQLite (MVP) → PostgreSQL (prod) | LawCheck: SQLite в dev, PG в prod |
| **CI/CD** | GitHub Actions + SARIF | Формат от ComplyTest — стандарт для security tools |
---
## 5. Ключевые дифференциаторы
### 5.1. Что делает сервис уникальным
1. **4-фазный cookie-аудит** — никто в РФ не делает. Все проверяют только «наличие баннера»
2. **Dark-pattern detection** — асимметрия кнопок, скрытый отказ, предзаполненные чекбоксы
3. **LLM-анализ политики** — 16 разделов, а не просто «есть/нет»
4. **API-first** — REST API для интеграции (агентства, хостинги, CRM)
5. **Batch + white-label PDF** — пакетная проверка 100+ сайтов с брендированными отчётами
6. **CI/CD интеграция** — GitHub Actions, GitLab CI, выход с exit code 1 при CRITICAL
7. **Self-hosted** — можно развернуть на своём сервере (конфиденциальность данных клиента)
### 5.2. Модели монетизации
| Модель | Цена | ЦА |
|--------|------|-----|
| **Pay-per-scan** | 500-1500 ₽/сайт | Разовые проверки |
| **Подписка (мониторинг)** | 3000-15000 ₽/мес | Агентства, крупные сайты |
| **White-label** | 30 000-100 000 ₽/мес | Агентства (ресейл) |
| **On-premise лицензия** | 150 000-500 000 ₽/год | Корпорации, банки |
| **API (pay-per-request)** | 50-200 ₽/скан | Интеграции |
---
## 6. Дорожная карта
### Фаза 1: Исправить критические баги (сейчас)
- [x] Аудит проведён
- [ ] `engine.py` — `_calculate_score()` при ошибке загрузки
- [ ] `privacy_link.py` — убрать `page.goto()`, проверять через aiohttp
- [ ] `form_checkbox.py` — переписать детекцию label
- [ ] `server_location.py` — заменить urllib на aiohttp
### Фаза 2: Довести до production-quality (1-2 недели)
- [ ] 4-фазный cookie-аудит (замена текущего cookie_banner.py)
- [ ] YAML-словари для трекеров
- [ ] Dark-pattern detection
- [ ] LLM-анализ политики (16 разделов)
- [ ] API с rate limiting и авторизацией
- [ ] CI/CD mode (exit codes, SARIF)
### Фаза 3: B2B-фичи (2-4 недели)
- [ ] Batch-мониторинг (очередь + уведомления)
- [ ] White-label PDF
- [ ] Подписки и биллинг
- [ ] Личный кабинет
### Фаза 4: Экспансия (1-2 месяца)
- [ ] On-premise поставка (Docker)
- [ ] Интеграции: GitHub App, GitLab, Bitrix24
- [ ] API-ключи для партнёров
---
## 7. Почему это будет работать
1. **Рынок растёт** — РКН перешёл на проактивный мониторинг. Каждый сайт под угрозой
2. **Конкуренты слабые** — form-based, без API, без deep checks. Никто не делает 4-фазный cookie-аудит
3. **Штрафы пугающие** — до 500 млн ₽. Стоимость проверки 500-1500 ₽ — копейки по сравнению
4. **Техническое преимущество** — Playwright 4-фазный + LLM + YAML-правила = лучшая архитектура
5. **Модель с низким порогом входа** — pay-per-scan без подписки
---
## Источники
[1] Reova — «Персональные данные на сайте: чек-лист из 37 пунктов (2026)» — https://www.reova.ru/blog/personalnye-dannye-na-sajte.html
[2] ComplyTest — Open-source GDPR/WCAG/Security scanner (70 правил) — https://complytest.com/
[3] gdpr-cookie-scanner — Open-source CLI, 4-фазный cookie-аудит — https://gdpr.slashgear.dev/
[4] LawCheck — Open-source 152-ФЗ сканер (FastAPI+Playwright+RQ) — https://github.com/lawcheck/lawcheck
[5] Toolfox — 134 проверки по 11 законам — https://toolfox.ru/tools/proverka-sajta-fz-152
[6] Сканэтика — 38+ критериев, мониторинг — https://scanetika.ru/
[7] EdLegal — AI-анализ политики, расчёт штрафов — https://edlegal.ru/help/scanner-152fz-guide/
[8] Proverito — Чек-лист 152-ФЗ (16 пунктов) — https://proverito.ru/chek-list-152-fz
[9] EDPB Website Auditing Tool — EU official — https://www.edpb.europa.eu/our-work-tools/our-documents/support-pool-experts-projects/edpb-website-auditing-tool_en