[QA Brain MVP] T2: Pre-Ingress Sanitizer (v1.0.0) & Request Fingerprinting Pipeline
สรุปงาน (Summary)
พัฒนาโมดูล Pre-Ingress Sanitizer (Policy v1.0.0) และ Canonical Request Fingerprinting Engine เพื่อตรวจจับและ Mask ข้อมูลความลับ (Secrets), ข้อมูลส่วนบุคคล (PII), และระงับความเสี่ยงจาก URL ภายนอก (SSRF / Active Tags) ก่อนที่ข้อมูลจะถูกบันทึกลงฐานข้อมูลหรือนำไปคำนวณ Idempotency
อ้างอิงข้อกำหนดสถาปัตยกรรม: RFC v4.1 (Section 2.7, 3)
ลำดับการทำงาน (Dependency): ขึ้นต่อกับ T1 (ต้องมี Data Model และ Types รองรับ)
ขอบเขตและงานที่ต้องทำ (Scope of Work)
1. ลำดับไปป์ไลน์ขาเข้า (Pre-Ingress Invariant Pipeline)
จัดเรียงลำดับการประมวลผลคำขอบันทึก Gotcha ให้เป็นไปตามมาตรฐาน:
Authenticate -> Authorize -> Canonicalize Request -> Masking (Sanitizer Policy v1.0.0) -> Sanitized Payload -> Compute Request Fingerprint & Hash (จาก Sanitized Payload) -> Transactional DB Write
2. Sanitizer Policy v1.0.0 Rules
พัฒนาฟังก์ชัน Sanitizer ตรวจสอบและแทนที่ข้อความที่ตรงกับ Pattern:
-
API Keys & Tokens:
- OpenAI / AI Token (
sk-[a-zA-Z0-9]{20,}) $\rightarrow$[REDACTED_API_KEY] - GitHub Token (
ghp_[a-zA-Z0-9]{36},github_pat_[a-zA-Z0-9_]{82}) $\rightarrow$[REDACTED_TOKEN] - GitLab PAT (
glpat-[a-zA-Z0-9\-_]{20,}) $\rightarrow$[REDACTED_GITLAB_PAT] - Jira PAT / Bearer Auth (
Bearer\s+[A-Za-z0-9\-\._~\+\/]+=*) $\rightarrow$Bearer [REDACTED_TOKEN] - Private Key Headers (
-----BEGIN [A-Z ]*PRIVATE KEY-----) $\rightarrow$[REDACTED_PRIVATE_KEY] - Password Fields (
password\s*[:=]\s*["']?[^"'\s]+["']?) $\rightarrow$password=[REDACTED]
- OpenAI / AI Token (
-
Personally Identifiable Information (PII):
- เลขประจำตัวประชาชนไทย (13 หลักที่มี/ไม่มีขีด) $\rightarrow$
[REDACTED_TH_ID] - หมายเลขบัตรเครดิต (13–19 หลักตามมาตรฐาน Luhn) $\rightarrow$
[REDACTED_CARD] - เบอร์โทรศัพท์มือถือไทย $\rightarrow$
[REDACTED_PHONE] - อีเมลบุคลากร (เฉพาะโดเมนภายนอกหรือตามที่กำหนด) $\rightarrow
[REDACTED_EMAIL]
- เลขประจำตัวประชาชนไทย (13 หลักที่มี/ไม่มีขีด) $\rightarrow$
-
SSRF & Dangerous URL Neutralization:
- ห้ามการยิง HTTP/Network Request ออกภายนอกเด็ดขาด (No Outbound Fetch)
- สกัด Active HTML Script Tags (
<script>,<iframe>,javascript:) - ตรวจสอบ URL Protocol ใน
evidenceRef: อนุญาตเฉพาะhttp:,https:หรือ Markdown Text ปกติ
3. มาตรการ Fail-Closed
- หากโมดูล Sanitizer เกิด Error หรือประมวลผล Regex นานเกิน Timeout (เช่น 1,000ms ReDoS Protection):
- ระบบต้องระงับคำขอทันที ตอบกลับด้วยข้อผิดพลาด HTTP 500 /
INTERNAL_ERROR - ห้าม เขียน Raw Payload ที่ยังไม่ผ่านการกรองลงใน Log หรือฐานข้อมูล
- ระบบต้องระงับคำขอทันที ตอบกลับด้วยข้อผิดพลาด HTTP 500 /
4. Canonical Request Fingerprinting จาก Sanitized Payload
- ฟังก์ชันทำ Canonical Serialization:
- เรียงลำดับ Keys ของ Object ตามพจนานุกรม (Alphabetical order) อย่างสม่ำเสมอ
- ตัด Whitespace ซ้ำซ้อน
-
การคำนวณ Fingerprint:
-
requestFingerprint: คำนวณจาก Canonical Sanitized Payload เพื่อป้องกันไม่ให้ความลับดิบหรือความแตกต่างของ Whitespace ทำให้เกิด Key แตกต่างกัน:sha256(canonicalSerialize({ workspaceId, principalType, principalId, operation, sanitizerPolicyVersion: "1.0.0", sanitizedInput })) -
sanitizedPayloadHash: SHA-256 ของ Sanitized Payload สำหรับใช้วัดความเปลี่ยนแปลงของเนื้อหา
-
เกณฑ์การตรวจรับ (Acceptance Criteria)
-
Unit Test ครอบคลุมชุดทดสอบ Secret & PII ครบทุกกรณี และแทนที่ด้วยแท็ก
[REDACTED_*]ได้อย่างถูกต้อง 100% - Unit Test การเกิด Regex Timeout / Thrown Exception ยืนยันว่าระบบหยุดทำงานแบบ Fail-Closed และไม่คายข้อมูลดิบออกมา
- คำขอสองคำขอที่มี Payload เดียวกันแต่มี Secret ต่างกัน เมื่อผ่านการ Mask แล้วจะได้ Fingerprint เดียวกัน ป้องกันการ bypass Idempotency
- ยืนยันว่าไม่มีโค้ดส่วนใดใน Sanitizer ทำการส่ง HTTP request ออกไปภายนอก (SSRF Immunity)