สรุปสั้นๆ: Bank Statement Parser ประมวลผลข้อมูลทั้งหมดในเครื่อง ปกปิด PII ตามค่าเริ่มต้น เสริมความแข็งแกร่งให้การแยกวิเคราะห์ XML จากการโจมตี XXE รัน LLM ในเครื่องผ่าน Ollama และมาพร้อม dependencies ที่ล็อกด้วย SHA-256 hash และ CycloneDX SBOM
ความปลอดภัยโดยการออกแบบ
Bank Statement Parser สร้างขึ้นเพื่อประมวลผลข้อมูลทางการเงินที่ละเอียดอ่อน การตัดสินใจออกแบบทุกครั้งให้ความสำคัญกับความปลอดภัย ความเป็นส่วนตัว และการตรวจสอบ
ไม่พึ่งพาคลาวด์
การประมวลผลทั้งหมดเกิดขึ้นภายในเครื่องในรันไทม์ของคุณ Deterministic parsers ไม่ทำการเรียกเครือข่ายใดๆ ไปป์ไลน์ PDF แบบไฮบริดใช้ Ollama สำหรับ LLM inference ในเครื่อง — ไม่มีข้อมูลถูกส่งไปยัง cloud API XML parser ถูกกำหนดค่าอย่างชัดเจนด้วย 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 entity expansionno_network=True-- บล็อกการเข้าถึงเครือข่ายขาออกทั้งหมดจาก parserload_dtd=False-- ป้องกันการโจมตีผ่าน DTD- การตัด namespace ก่อนประมวลผล -- รองรับ CAMT.053 ทุกเวอร์ชันอย่างปลอดภัย
ความปลอดภัยไฟล์ ZIP
iter_secure_xml_entries() ตรวจสอบสมาชิก ZIP ทุกรายการก่อนแตกไฟล์:
- ขีดจำกัดขนาดรายการ: 10 MB ต่อรายการ (กำหนดค่าได้)
- ขีดจำกัดขนาดรวม: 50 MB รวมที่ไม่บีบอัด (กำหนดค่าได้)
- ขีดจำกัดอัตราส่วนการบีบอัด: ค่าเริ่มต้น 100:1 -- ตรวจจับ ZIP bomb
- ปฏิเสธรายการที่เข้ารหัส: รายการที่เข้ารหัสจะถูกข้ามพร้อมคำเตือน
- ไม่เขียนดิสก์: ไบต์ XML ส่งผ่านไปยัง parser โดยตรงผ่าน
from_bytes()
การป้องกัน Path Traversal
การตรวจสอบอินพุตจะบล็อกเส้นทางไฟล์ที่เป็นอันตราย:
- null bytes, รูปแบบ directory traversal (
../) และ symlinks ถูกปฏิเสธ - การตรวจสอบนามสกุลไฟล์กับรูปแบบที่คาดหวัง
- ขีดจำกัดขนาดไฟล์ (ค่าเริ่มต้น 100 MB กำหนดค่าได้)
การตรวจสอบยอดคงเหลือ (Golden Rule)
การดึงข้อมูล PDF ทุกครั้งจะถูกตรวจสอบด้วยสมการ: opening balance + credits − debits == closing balance ผลลัพธ์จะถูกแท็กเป็น VERIFIED, DISCREPANCY หรือ FAILED ความคลาดเคลื่อนสามารถตรวจสอบแบบโต้ตอบด้วย --type review
เอาต์พุตแบบ Deterministic
สำหรับรูปแบบที่มีโครงสร้าง (CAMT, PAIN.001, CSV, OFX, QFX, MT940) เมื่อได้รับไฟล์อินพุตเดียวกัน parser จะสร้างเอาต์พุตที่เหมือนกันทุกไบต์ทุกครั้งที่รัน ไม่มีการสุ่ม ไม่มีการ inference โมเดล ไม่มีการสุ่มตัวอย่างแบบ heuristic สิ่งนี้สำคัญสำหรับ:
- ความสามารถในการทำซ้ำสำหรับการตรวจสอบ: รันไฟล์เดียวกันสองครั้งแล้ว diff เอาต์พุต
- การปฏิบัติตามกฎระเบียบ: แสดงให้เห็นการประมวลผลที่สอดคล้องกัน
- การตรวจสอบ CI: 718 การทดสอบบังคับใช้ determinism ด้วย 100% branch coverage
ความปลอดภัยของ Supply Chain
- Dependencies ล็อกด้วย SHA-256 hash: ทุกแพ็กเกจใน
poetry.lockมี file hashes ที่ตรวจสอบแล้ว - CycloneDX SBOM: ทุกรีลีสมี Software Bill of Materials
- GitHub build provenance: Attestation เชื่อมโยงแต่ละ artifact กับ source commit
- Signed commits: คอมมิตทั้งหมดลงนามด้วย SSH และตรวจสอบใน CI
- การตรวจสอบ dependencies:
scripts/verify_locked_hashes.pyตรวจสอบ hashes ทั้งหมดในเครื่อง
ยืนยันในเครื่อง
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