简述: Bank Statement Parser 在本地处理所有数据,默认脱敏 PII,加固 XML 解析以防御 XXE 攻击,通过 Ollama 在本地运行 LLM,并附带 SHA-256 哈希锁定依赖和 CycloneDX SBOM。
安全设计
Bank Statement Parser 专为处理敏感财务数据而构建。每个设计决策都优先考虑安全性、隐私性和可审计性。
零云端依赖
所有处理在本地运行时中进行。确定性解析器不发起任何网络调用。混合 PDF 管道使用 Ollama 进行本地 LLM 推理——不向云端 API 发送数据。XML 解析器显式配置为 no_network=True、resolve_entities=False 和 load_dtd=False,以防止任何出站访问。
PII 脱敏
个人身份信息(姓名、IBAN、邮政地址)在 CLI 输出和流模式下自动脱敏。默认开启。
- CLI:敏感字段显示为
***REDACTED*** - 流式处理:
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 MB(可配置)
- 总大小上限:未压缩总计 50 MB(可配置)
- 压缩比限制:默认 100:1——检测 ZIP 炸弹
- 加密条目拒绝:跳过加密条目并发出警告
- 无磁盘写入:XML 字节通过
from_bytes()直接传递给解析器
路径遍历防护
输入验证阻止危险文件路径:
- 空字节、目录遍历模式(
../)和符号链接均被拒绝 - 文件扩展名按预期格式验证
- 文件大小限制(默认 100 MB,可配置)
余额校验(黄金法则)
每次 PDF 提取均通过以下等式验证:期初余额 + 贷方 − 借方 == 期末余额。结果标记为 VERIFIED、DISCREPANCY 或 FAILED。差异可通过 --type review 进行交互式审查。
确定性输出
对于结构化格式(CAMT、PAIN.001、CSV、OFX、QFX、MT940),给定相同的输入文件,解析器每次运行产生字节一致的输出。无随机性,无模型推理,无启发式采样。这对以下方面至关重要:
- 审计可重现性:运行同一文件两次并对比输出
- 监管合规:证明处理一致性
- CI 验证:718 项测试强制确保确定性,100% 分支覆盖率
供应链安全
- SHA-256 哈希锁定依赖:
poetry.lock中的每个包均有已验证的文件哈希 - CycloneDX SBOM:每个版本包含软件物料清单
- GitHub 构建来源:证明将每个构件链接到其源提交
- 签名提交:所有提交均经 SSH 签名并在 CI 中验证
- 依赖验证:
scripts/verify_locked_hashes.py在本地验证所有哈希
本地验证
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