In breve: Bank Statement Parser elabora tutti i dati in locale, oscura i dati personali di default, protegge il parsing XML contro attacchi XXE, esegue i LLM localmente via Ollama e include dipendenze con hash SHA-256 bloccati e una SBOM CycloneDX.
Sicurezza fin dalla progettazione
Bank Statement Parser è progettato per l'elaborazione di dati finanziari sensibili. Ogni decisione progettuale dà priorità a sicurezza, privacy e verificabilità.
Zero dipendenze cloud
Tutta l'elaborazione avviene in locale nel proprio runtime. I parser deterministici non effettuano chiamate di rete. La pipeline PDF ibrida usa Ollama per l'inferenza LLM locale — nessun dato viene inviato ad API cloud. I parser XML sono configurati esplicitamente con no_network=True, resolve_entities=False e load_dtd=False per impedire qualsiasi accesso in uscita.
Oscuramento PII
Le informazioni di identificazione personale (nomi, IBAN, indirizzi postali) vengono automaticamente oscurate nell'output CLI e in modalità streaming. Questa funzione è attiva di default.
- CLI: i campi sensibili appaiono come
***REDACTED*** - Streaming:
parse_streaming(redact_pii=True)(default) - Esportazioni: CSV/JSON/Excel conservano i dati completi per l'elaborazione a valle
- Attivazione: usare
--show-piioredact_pii=Falsequando si necessita di output non oscurato
Sicurezza XML (protezione XXE)
Tutto il parsing XML usa lxml con impostazioni protette:
resolve_entities=False-- impedisce attacchi di espansione entità XMLno_network=True-- blocca tutti gli accessi di rete in uscita dal parserload_dtd=False-- previene attacchi basati su DTD- Rimozione dei namespace prima dell'elaborazione — gestisce qualsiasi variante CAMT.053 in sicurezza
Sicurezza archivi ZIP
iter_secure_xml_entries() valida ogni membro ZIP prima dell'estrazione:
- Dimensione massima per voce: 10 MB per voce (configurabile)
- Dimensione totale massima: 50 MB totali non compressi (configurabile)
- Limite del rapporto di compressione: 100:1 di default — rileva le ZIP bomb
- Rifiuto voci crittografate: le voci crittografate vengono ignorate con un avviso
- Nessuna scrittura su disco: i byte XML passano direttamente al parser tramite
from_bytes()
Prevenzione path traversal
La validazione dell'input blocca i percorsi file pericolosi:
- Byte nulli, pattern di directory traversal (
../) e link simbolici vengono rifiutati - Validazione dell'estensione file rispetto ai formati previsti
- Limiti di dimensione file (100 MB di default, configurabile)
Verifica del saldo (Golden Rule)
Ogni estrazione PDF viene verificata con l'equazione: opening balance + credits − debits == closing balance. I risultati sono classificati come VERIFIED, DISCREPANCY o FAILED. Le discrepanze possono essere riviste interattivamente con --type review.
Output deterministico
Per i formati strutturati (CAMT, PAIN.001, CSV, OFX, QFX, MT940), dato lo stesso file di input, il parser produce un output identico byte per byte ad ogni esecuzione. Nessuna casualità, nessuna inferenza di modello, nessun campionamento euristico. Questo è fondamentale per:
- Riproducibilità degli audit: eseguire lo stesso file due volte e confrontare l'output
- Conformità normativa: dimostrare un'elaborazione coerente
- Verifica CI: 718 test garantiscono il determinismo con copertura branch al 100%
Sicurezza della supply chain
- Dipendenze con hash SHA-256 bloccati: ogni pacchetto in
poetry.lockha hash dei file verificati - CycloneDX SBOM: ogni release include una Software Bill of Materials
- Provenienza build GitHub: l'attestazione collega ogni artefatto al commit sorgente
- Commit firmati: tutti i commit sono firmati SSH e verificati in CI
- Verifica delle dipendenze:
scripts/verify_locked_hashes.pyvalida tutti gli hash localmente
Verifica in locale
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