Кратко: Bank Statement Parser обрабатывает все данные локально, маскирует PII по умолчанию, защищает XML-парсинг от XXE-атак, запускает LLM локально через Ollama и поставляется с SHA-256 hash-lock зависимостей и CycloneDX SBOM.
Безопасность по задумке
Bank Statement Parser создан для обработки конфиденциальных финансовых данных. Каждое проектное решение ставит на первое место безопасность, конфиденциальность и возможность аудита.
Нулевая зависимость от облака
Вся обработка происходит локально в вашей среде выполнения. Детерминированные парсеры не совершают сетевых вызовов. Гибридный PDF-pipeline использует Ollama для локального инференса LLM — данные не отправляются в облачные API. XML-парсеры явно настроены с no_network=True, resolve_entities=False и load_dtd=False для предотвращения любого исходящего доступа.
Маскирование PII
Персональные данные (имена, IBAN, почтовые адреса) автоматически маскируются в выводе CLI и потоковом режиме. Это включено по умолчанию.
- CLI: конфиденциальные поля показываются как
***REDACTED*** - Streaming:
parse_streaming(redact_pii=True)(по умолчанию) - Экспорт: CSV/JSON/Excel сохраняют полные данные для дальнейшей обработки
- Показать данные: используйте
--show-piiилиredact_pii=False, когда нужен немаскированный вывод
Безопасность XML (защита от XXE)
Весь XML-парсинг использует lxml с усиленными настройками:
resolve_entities=False-- предотвращает атаки расширения XML-сущностейno_network=True-- блокирует весь исходящий сетевой доступ из парсераload_dtd=False-- предотвращает DTD-атаки- Удаление пространств имён перед обработкой -- безопасная работа с любым вариантом CAMT.053
Безопасность ZIP-архивов
iter_secure_xml_entries() проверяет каждую запись ZIP перед извлечением:
- Лимит размера записи: 10 МБ на запись (настраивается)
- Лимит общего размера: 50 МБ несжатого объёма (настраивается)
- Лимит степени сжатия: 100:1 по умолчанию -- обнаруживает ZIP-бомбы
- Отклонение зашифрованных записей: зашифрованные записи пропускаются с предупреждением
- Без записи на диск: XML-байты передаются напрямую в парсер через
from_bytes()
Предотвращение обхода путей
Валидация ввода блокирует опасные пути к файлам:
- Нулевые байты, шаблоны обхода каталогов (
../) и символические ссылки отклоняются - Валидация расширения файла по ожидаемым форматам
- Ограничение размера файла (100 МБ по умолчанию, настраивается)
Проверка баланса (Золотое правило)
Каждое извлечение из PDF проверяется уравнением: opening balance + credits − debits == closing balance. Результаты размечаются как VERIFIED, DISCREPANCY или FAILED. Расхождения можно просмотреть в интерактивном режиме через --type review.
Детерминированный вывод
Для структурированных форматов (CAMT, PAIN.001, CSV, OFX, QFX, MT940) при одинаковом входном файле парсер каждый раз выдаёт побайтово идентичный результат. Без случайности, без инференса модели, без эвристической выборки. Это критично для:
- Воспроизводимость аудита: запустите один файл дважды и сравните результат
- Соответствие нормативам: демонстрация стабильной обработки
- Проверка в CI: 718 тестов обеспечивают детерминизм со 100% покрытием ветвей
Безопасность цепочки поставок
- SHA-256 hash-lock зависимостей: каждый пакет в
poetry.lockимеет проверенные hash файлов - CycloneDX SBOM: каждый релиз включает спецификацию программного обеспечения
- Аттестация происхождения сборки GitHub: связывает каждый артефакт с исходным коммитом
- Подписанные коммиты: все коммиты подписаны SSH и проверены в CI
- Проверка зависимостей:
scripts/verify_locked_hashes.pyпроверяет все hash локально
Проверьте локально
python -m pytest # 718 tests, 100% branch coverage
python scripts/verify_locked_hashes.py # SHA-256 hash verification
git log --show-signature -1 # Verify commit signature