TL;DR: Bank Statement Parser procesează toate datele local, redactează PII implicit, securizează parsarea XML împotriva atacurilor XXE, rulează LLM-uri local prin Ollama și este livrat cu dependențe SHA-256 blocate cu hash și un SBOM CycloneDX.
Securitate prin design
Bank Statement Parser este construit pentru procesarea datelor financiare sensibile. Fiecare decizie de proiectare prioritizează securitatea, confidențialitatea și auditabilitatea.
Zero dependență de cloud
Toată procesarea are loc local în runtime. Parserele deterministe nu efectuează niciun apel de rețea. Pipeline-ul hibrid PDF folosește Ollama pentru inferență LLM locală — nicio dată nu este trimisă către API-uri cloud. Parserele XML sunt configurate explicit cu no_network=True, resolve_entities=False și load_dtd=False pentru a preveni orice acces de ieșire.
Redactare PII
Informațiile de identificare personală (nume, IBAN-uri, adrese poștale) sunt redactate automat în ieșirea CLI și modul streaming. Funcția este activată implicit.
- CLI: Câmpurile sensibile apar ca
***REDACTED*** - Streaming:
parse_streaming(redact_pii=True)(implicit) - Exporturi: CSV/JSON/Excel păstrează datele complete pentru procesarea ulterioară
- Activare: Folosiți
--show-piisauredact_pii=Falsecând aveți nevoie de ieșire neredactată
Securitate XML (protecție XXE)
Toată parsarea XML folosește lxml cu setări securizate:
resolve_entities=False-- previne atacurile de expandare a entităților XMLno_network=True-- blochează tot accesul de rețea de ieșire de la parserload_dtd=False-- previne atacurile bazate pe DTD- Eliminarea namespace-ului înainte de procesare -- gestionează orice variantă CAMT.053 în siguranță
Securitatea arhivelor ZIP
iter_secure_xml_entries() validează fiecare membru ZIP înainte de extragere:
- Limită de dimensiune per intrare: 10 MB per intrare (configurabil)
- Limită dimensiune totală: 50 MB total necomprimat (configurabil)
- Limită raport de compresie: 100:1 implicit -- detectează ZIP bomb
- Respingere intrări criptate: Intrările criptate sunt omise cu un avertisment
- Fără scriere pe disc: Octeții XML trec direct la parser prin
from_bytes()
Prevenirea traversării căilor
Validarea intrărilor blochează căile periculoase de fișiere:
- Octeții nuli, tiparele de traversare a directoarelor (
../) și legăturile simbolice sunt respinse - Validarea extensiilor de fișiere față de formatele așteptate
- Limite de dimensiune a fișierului (100 MB implicit, configurabil)
Verificarea soldului (Regula de Aur)
Fiecare extracție PDF este verificată cu ecuația: opening balance + credits − debits == closing balance. Rezultatele sunt etichetate ca VERIFIED, DISCREPANCY sau FAILED. Discrepanțele pot fi revizuite interactiv cu --type review.
Ieșire deterministă
Pentru formatele structurate (CAMT, PAIN.001, CSV, OFX, QFX, MT940), cu același fișier de intrare, parserul produce ieșire identică la nivel de octet la fiecare rulare. Fără aleatorism, fără inferență de model, fără eșantionare euristică. Acest lucru este esențial pentru:
- Reproductibilitate de audit: Rulați același fișier de două ori și comparați rezultatul
- Conformitate reglementară: Demonstrați procesare consecventă
- Verificare CI: 718 teste impun determinismul cu acoperire de 100% a ramurilor
Securitatea lanțului de aprovizionare
- Dependențe SHA-256 blocate cu hash: Fiecare pachet din
poetry.lockare hash-uri de fișiere verificate - CycloneDX SBOM: Fiecare versiune include o listă de materiale software
- Proveniența build-ului GitHub: Atestarea leagă fiecare artefact la commit-ul sursă
- Commit-uri semnate: Toate commit-urile sunt semnate SSH și verificate în CI
- Verificarea dependențelor:
scripts/verify_locked_hashes.pyvalidează toate hash-urile local
Verificați local
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