TL;DR: Bank Statement Parser xử lý toàn bộ dữ liệu cục bộ, ẩn danh PII mặc định, tăng cường phân tích XML chống tấn công XXE, chạy LLM cục bộ qua Ollama, và đi kèm phụ thuộc khóa hash SHA-256 và CycloneDX SBOM.
Bảo mật theo thiết kế
Bank Statement Parser được xây dựng để xử lý dữ liệu tài chính nhạy cảm. Mọi quyết định thiết kế đều ưu tiên bảo mật, quyền riêng tư và khả năng kiểm toán.
Không phụ thuộc cloud
Toàn bộ quá trình xử lý diễn ra cục bộ trong runtime của bạn. Các trình phân tích xác định không thực hiện cuộc gọi mạng nào. Pipeline PDF hybrid sử dụng Ollama cho suy luận LLM cục bộ — không có dữ liệu nào được gửi đến cloud API. Trình phân tích XML được cấu hình rõ ràng với no_network=True, resolve_entities=False, và load_dtd=False để ngăn chặn mọi truy cập ra bên ngoài.
Ẩn danh PII
Thông tin nhận dạng cá nhân (tên, IBAN, địa chỉ bưu chính) được tự động ẩn danh trong đầu ra CLI và chế độ streaming. Tính năng này được bật mặc định.
- CLI: Các trường nhạy cảm hiển thị dạng
***REDACTED*** - Streaming:
parse_streaming(redact_pii=True)(mặc định) - Xuất dữ liệu: CSV/JSON/Excel giữ nguyên dữ liệu đầy đủ cho xử lý downstream
- Bật hiển thị: Sử dụng
--show-piihoặcredact_pii=Falsekhi cần đầu ra chưa ẩn danh
Bảo mật XML (Bảo vệ XXE)
Toàn bộ phân tích XML sử dụng lxml với cài đặt tăng cường:
resolve_entities=False-- ngăn tấn công mở rộng thực thể XMLno_network=True-- chặn mọi truy cập mạng ra bên ngoài từ parserload_dtd=False-- ngăn tấn công dựa trên DTD- Loại bỏ namespace trước khi xử lý -- xử lý mọi biến thể CAMT.053 an toàn
Bảo mật tệp ZIP
iter_secure_xml_entries() xác thực mọi thành viên ZIP trước khi trích xuất:
- Giới hạn kích thước mục nhập: 10 MB mỗi mục nhập (có thể cấu hình)
- Giới hạn tổng kích thước: 50 MB tổng không nén (có thể cấu hình)
- Giới hạn tỷ lệ nén: Mặc định 100:1 -- phát hiện ZIP bomb
- Từ chối mục nhập mã hóa: Mục nhập mã hóa bị bỏ qua kèm cảnh báo
- Không ghi vào đĩa: Byte XML chuyển trực tiếp đến parser qua
from_bytes()
Ngăn chặn Path Traversal
Xác thực đầu vào chặn các đường dẫn tệp nguy hiểm:
- Byte null, mẫu truyền tải thư mục (
../), và symlink bị từ chối - Xác thực extension tệp theo các định dạng mong đợi
- Giới hạn kích thước tệp (mặc định 100 MB, có thể cấu hình)
Xác minh số dư (Golden Rule)
Mọi kết quả trích xuất PDF đều được xác minh bằng phương trình: opening balance + credits − debits == closing balance. Kết quả được gắn nhãn VERIFIED, DISCREPANCY, hoặc FAILED. Các sai lệch có thể được xem xét tương tác với --type review.
Đầu ra xác định
Với các định dạng có cấu trúc (CAMT, PAIN.001, CSV, OFX, QFX, MT940), cùng một tệp đầu vào, trình phân tích tạo đầu ra giống byte mỗi lần chạy. Không ngẫu nhiên, không suy luận mô hình, không lấy mẫu heuristic. Điều này quan trọng cho:
- Tái tạo kiểm toán: Chạy cùng tệp hai lần và so sánh đầu ra
- Tuân thủ quy định: Chứng minh xử lý nhất quán
- Xác minh CI: 718 bài kiểm tra đảm bảo tính xác định với 100% độ phủ nhánh
Bảo mật chuỗi cung ứng
- Phụ thuộc khóa hash SHA-256: Mọi gói trong
poetry.lockcó hash tệp đã xác minh - CycloneDX SBOM: Mỗi bản phát hành bao gồm Software Bill of Materials
- Nguồn gốc bản dựng GitHub: Chứng thực liên kết mỗi artifact với commit nguồn
- Commit có chữ ký: Tất cả commit được ký SSH và xác minh trong CI
- Xác minh phụ thuộc:
scripts/verify_locked_hashes.pyxác thực tất cả hash cục bộ
Xác minh cục bộ
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