From b9db93538970ab5a68814983434eedec84cd9316 Mon Sep 17 00:00:00 2001 From: neo <397763@gmail.com> Date: Wed, 10 Jun 2026 00:49:07 +0500 Subject: [PATCH] =?UTF-8?q?v2.0:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BA=D1=80=D0=B8=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=B3=D0=B8,=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=204=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B8,=204-=D1=84=D0=B0=D0=B7=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?cookie-=D0=B0=D1=83=D0=B4=D0=B8=D1=82,=20retry-=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B8=D0=BA=D0=B0,=20YAML-=D1=81=D0=BB=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=80=D0=B8,=20LLM-=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7,=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлено: - 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) --- .gitignore | 19 +- STRATEGY.md | 346 +++++++++++++++++++++++++++ api/server.py | 7 +- data/input/russia_hotels_domains.csv | 1 + data/input/test_batch.csv | 3 + dictionaries/trackers.yaml | 84 +++++++ logs/app.log | 46 ---- main.py | 102 +++++--- pyproject.toml | 54 +++++ reports/templates/report.html.j2 | 30 +-- requirements.txt | 3 + scanner/checks/__init__.py | 27 ++- scanner/checks/consent_doc.py | 76 ++++++ scanner/checks/cookie_audit.py | 187 +++++++++++++++ scanner/checks/external_scripts.py | 133 +++++----- scanner/checks/form_checkbox.py | 130 ++++++---- scanner/checks/llm_policy.py | 233 ++++++++++++++++++ scanner/checks/operator_info.py | 135 +++++++++++ scanner/checks/privacy_link.py | 34 ++- scanner/checks/server_location.py | 47 ++-- scanner/engine.py | 89 +++++-- scanner/logging_config.py | 41 ++++ scanner/output.py | 46 ++++ tests/test_smoke.py | 138 +++++++++++ 24 files changed, 1725 insertions(+), 286 deletions(-) create mode 100644 STRATEGY.md create mode 100644 data/input/russia_hotels_domains.csv create mode 100644 data/input/test_batch.csv create mode 100644 dictionaries/trackers.yaml delete mode 100644 logs/app.log create mode 100644 pyproject.toml create mode 100644 scanner/checks/consent_doc.py create mode 100644 scanner/checks/cookie_audit.py create mode 100644 scanner/checks/llm_policy.py create mode 100644 scanner/checks/operator_info.py create mode 100644 scanner/logging_config.py create mode 100644 scanner/output.py create mode 100644 tests/test_smoke.py diff --git a/.gitignore b/.gitignore index 5c888d5..638abc3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,17 @@ # Python __pycache__/ *.py[cod] +*.pyo *.egg-info/ dist/ build/ .eggs/ *.egg -# Virtual env +# Virtual environment .venv/ venv/ +env/ # IDE .vscode/ @@ -17,14 +19,15 @@ venv/ *.swp *.swo -# Data -data/output/results.json -data/output/reports/audit_*.pdf - -# Env -.env -.env.local +# Project output +data/output/ +logs/ # OS .DS_Store Thumbs.db + +# Secrets +.env +*.pem +*.key diff --git a/STRATEGY.md b/STRATEGY.md new file mode 100644 index 0000000..8c6fcbc --- /dev/null +++ b/STRATEGY.md @@ -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 | Ссылка рядом с каждой формой | Поиск