dr
2026-08-19 12:05:27 +04:00
1
2026-08-23 07:11:06 +03:00
1
2026-08-25 07:58:51 +03:00

DrHider — обфускация документов (Managed Flask)

URL: https://drhider.pythonk8s.dev.nubes.ru/ Репозиторий: https://gitea.services.ngcloud.ru/Nail/drhider Платформа: Штурвал (Managed Flask на pythonk8s) Дизайн фронтенда: /home/naeel/nubes/design/


Что делает

Загружаешь документы (.docx, .pdf, .txt, .zip) — получаешь ZIP с обфусцированными копиями. Все персональные данные, реквизиты, телефоны, email заменяются на фиктивные. В архиве — mapping.csv с таблицей замен (оригинал → фиктивное).

Обфускация двухпроходная:

  1. Проход 1 (сбор): regex + LLM находят все сущности во всех файлах → глобальный словарь замен
  2. Проход 2 (замена): применяем замены ко всем файлам → ZIP

Согласованность: одна и та же сущность во всех файлах → одно и то же фиктивное значение.


ПРАВИЛА ДЛЯ АГЕНТОВ (читать перед ЛЮБЫМ действием)

1. НЕ смотреть локальные папки contracts/contracts-flask

Весь старый код drhider — ТОЛЬКО на ВМ (5.172.178.213). НЕ локально. Единственное исключение: /home/naeel/nubes/loadtest/ (образец структуры managed Flask).

2. Штурвал запускает Flask САМ

  • БЕЗ Dockerfile (удалён)
  • БЕЗ gunicorn (нет в requirements.txt)
  • Точка входа: site/app.pyapp = create_app()
  • Деплой: git push origin master → авто-деплой в UI Штурвала

3. НЕ менять код без «делай»

Даже если ошибка очевидна. Показать → описать → ЖДАТЬ.

4. После ЛЮБОЙ правки:

python3 -c "import py_compile; py_compile.compile('файл.py', doraise=True)"
git add -A && git commit -m "подробное описание" && git push

5. Документировать ВСЁ в History/

Каждое изменение, план, ошибку — в отдельный .md файл.


Структура проекта

drhider/ — пакет ядра обфускации

Файл Назначение
__init__.py re-export: obfuscate_files, LLMClient, TwoPassObfuscator
config.py Константы: regex-паттерны (ENTITY_PATTERNS, COMPANY_PATTERN, PERSON_PATTERN), словари имён/городов/улиц
llm_client.py LLMClient — HTTP-клиент к LLM API (aillm.ru)
extractor.py Извлечение текста из .docx/.pdf/.doc/.txt + expand_zips
scanner.py Проход 1: scan_regex (regex) + scan_llm_ner (LLM NER) + генерация гибридных токенов
replacer.py Проход 2: apply_replacements, replace_in_docx
builder.py Сборка: build_zip, build_mapping_csv
obfuscator.py TwoPassObfuscator — оркестратор + obfuscate_files()

Фиктивные значения — гибридные токены (шаблон + номер), генерируются в scanner.py через TYPE_POOLS + _next_token(). Примеры: Иванов_0001, ООО_Технология_0034, ул_Ленина_0015. Отдельного пакета генераторов (generators/) нет.

site/ — Flask-приложение

Файл Назначение
app.py create_app() — создание Flask, регистрация blueprint'ов, VERSION
session.py Управление сессиями: файлы, результат, CSV, очистка по таймауту
routes/__init__.py register_routes(app)
routes/main_bp.py GET / — HTML-интерфейс
routes/health_bp.py GET /health{"ok": true, "version": "..."}
routes/api_bp.py API загрузки/обработки/скачивания (см. раздел API)
templates/index.html UI (выбор файлов, прогресс, скачивание)
static/favicon.svg Иконка

Корневые файлы

Файл Назначение
requirements.txt flask, python-docx, pdfplumber, httpx
.gitignore __pycache__/, *.pyc, .env
.gitea/workflows/deploy.yaml CI: валидация Python
History/ Документация всех изменений
README.md Этот файл
docs/ARCHITECTURE.md Архитектура
docs/DEPLOY.md Деплой, ВМ, переменные окружения
docs/DEVELOPMENT.md Порядок действий при изменении кода

API

Метод Путь Что делает
GET / HTML-интерфейс
GET /health {"ok": true, "version": "..."}
POST /api/upload Загрузка файлов в сессию → {ok, session, count}
GET /api/process_stream/<sid> SSE: обработка файлов сессии, прогресс пофайлово
POST /api/process/<sid> Обработка файлов сессии (legacy)
GET /api/download/<sid> Скачать ZIP с обфусцированными файлами
GET /api/csv/<sid> Скачать mapping.csv отдельно

Переменные окружения (Штурвал)

Переменная Значение
LLM_API_KEY (секрет — задаётся в переменных окружения Штурвала, не в git)
LLM_URL https://api.aillm.ru/v1/chat/completions
LLM_MODEL gpt-oss-120b

Известные ограничения / риски

  • LLM prompt injection: текст документа вставляется в LLM-промпт дословно; вредоносный документ может содержать инструкции, подавляющие обнаружение персональных данных. Итог — неполная обфускация без явной ошибки. Известный класс риска (не фикс кода), обнаружен при код-ревью (2026-08-24, History/sonnet/2026-08-24-code-review-sonnet.md).
  • ZIP без документов: фронт добавляет такой ZIP в список как есть (v0.0.69), бэк раскрывает из него только документы (фильтр расширений, v0.0.75); файлы без документов в результат не попадают.

Связь с ВМ contracts (legacy)

На ВМ 5.172.178.213 (contracts.kube5s.ru) есть старая версия drhider:

  • drhider_server.py на порту 8767 — standalone HTTP-сервер
  • drhider.py — та же логика, что и в этом проекте (скопирована оттуда)

Этот проект (drhider.pythonk8s.dev.nubes.ru) — независимый managed Flask, заменяет ВМ-версию.

SSH к ВМ: ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213

S
Description
No description provided
Readme
21 MiB
Languages
Python 69.6%
JavaScript 17.6%
HTML 12.7%
Dockerfile 0.1%