ข้ามไปยังเนื้อหาหลัก

ความปลอดภัยและการรักษาความปลอดภัย

Rosetta ได้รับการออกแบบมาให้มีความปลอดภัยในสภาพแวดล้อมที่อาจมีภัยคุกคาม — ซึ่งข้อมูล locale อาจมาจากแหล่งที่ไม่น่าเชื่อถือ, การสร้างชื่อไฟล์ที่อาจหลุดรอดขอบเขตของไดเรกทอรี, และผลลัพธ์จาก LLM ที่อาจมีเนื้อหาใดๆ ก็ได้

รูปแบบภัยคุกคาม

ภัยคุกคามช่องทางการโจมตีการบรรเทาผลกระทบ
Prototype pollutionคีย์ JSON ที่ถูกสร้างขึ้นมา (__proto__, constructor)ปฏิเสธตั้งแต่ขั้นตอนการแยกวิเคราะห์ (Parse time)
Path traversalรหัส Locale เช่น ../../etc/passwdการเขียนไฟล์จะถูกตรวจสอบความถูกต้องให้อยู่ในไดเรกทอรีที่กำหนดไว้เท่านั้น
Code block corruptionLLM แปลเนื้อหาภายในบล็อกโค้ดป้องกันด้วย Unicode sentinel
Hallucinated keysLLM ส่งคืนคีย์ที่ไม่ได้ถูกส่งไปการตรวจสอบความถูกต้องของการตอบกลับ — จะเขียนเฉพาะคีย์ที่ได้รับการยอมรับเท่านั้น
Runaway token spendการวนลูปลองใหม่แบบไม่สิ้นสุดจำกัดงบประมาณผ่าน maxRetries

การป้องกัน Prototype Pollution

คีย์ locale ทั้งหมดจะถูกตรวจสอบความถูกต้องกับ blocklist ก่อนการประมวลผล:

  • __proto__
  • constructor
  • prototype

คีย์ใดๆ ที่ตรงกับรูปแบบเหล่านี้จะถูกปฏิเสธและแสดงข้อผิดพลาด สิ่งนี้ช่วยป้องกันไม่ให้ผู้โจมตีใช้ไฟล์ locale ที่สร้างขึ้นมาเพื่อแก้ไข JavaScript object prototypes

การจำกัดขอบเขต Path

เมื่อเขียนไฟล์ locale rosetta จะตรวจสอบความถูกต้องว่า path ผลลัพธ์ยังคงอยู่ภายในไดเรกทอรีที่กำหนดไว้ (localesDir, contentDir) รหัส Locale จะถูกทำความสะอาด (Sanitized) — รหัสเช่น ../../secrets จะไม่สามารถเขียนออกไปนอกไดเรกทอรีที่คาดหวังได้

การป้องกันบล็อกเนื้อหา

ในระหว่างการแปลเนื้อหา Markdown องค์ประกอบที่มีโครงสร้างจะถูกแทนที่ด้วย Unicode sentinel placeholders ก่อนที่ข้อความจะถูกส่งไปยัง LLM:

  1. Code blocks (fenced และ inline) → sentinel
  2. Hugo shortcodes ({{< >}}, {{% %}}) → sentinel
  3. Raw HTML → sentinel
  4. Interpolation variables ({{ .Count }}) → sentinel

หลังจากการแปล sentinels จะถูกแทนที่กลับด้วยเนื้อหาต้นฉบับ LLM จะไม่เห็น code blocks, shortcodes หรือ HTML เลย — จึงไม่สามารถทำให้ข้อมูลเหล่านี้เสียหายได้

การตรวจสอบความถูกต้องของการตอบกลับ

เมื่อ LLM ส่งคืนการตอบกลับแบบ JSON rosetta จะตรวจสอบความถูกต้องว่า:

  • มีเฉพาะคีย์ที่ถูกส่งไปในชุดข้อมูล (Batch) เท่านั้นที่ปรากฏในการตอบกลับ
  • ไม่มีคีย์ส่วนเกินถูกแทรกเข้ามา
  • การตอบกลับสามารถแยกวิเคราะห์เป็น JSON ที่ถูกต้องได้

คีย์ที่เกิดจากการ Hallucinate จะถูกละทิ้งไปอย่างเงียบๆ สิ่งนี้ช่วยป้องกันไม่ให้ผลลัพธ์จาก LLM แทรกการแปลที่ไม่คาดคิดลงในไฟล์ locale ของคุณ

Quality Gate

ทุกการแปลจะถูกตรวจสอบความถูกต้องผ่านการตรวจสอบแบบกำหนดได้ (Deterministic checks) 5 ขั้นตอนก่อนที่จะถูกเขียนลงดิสก์ ดูรายละเอียดเพิ่มเติมได้ที่ Quality Gate

Exponential Backoff

การเรียกใช้ API จะใช้ exponential backoff พร้อม jitter เมื่อได้รับการตอบกลับแบบ 429 (จำกัดอัตราการเรียก) และ 5xx (ข้อผิดพลาดของเซิร์ฟเวอร์) การลองใหม่ 3 ครั้งพร้อมการหน่วงเวลาที่เพิ่มขึ้นจะช่วยป้องกันการกระหน่ำเรียก API ในช่วงที่ระบบขัดข้อง

Request Timeout

ทุกคำขอ API จะมีการตั้งเวลาหมดอายุ (Timeout) ไว้ที่ 30 วินาทีผ่าน AbortController สิ่งนี้ช่วยป้องกันไม่ให้กระบวนการซิงค์ค้างไปตลอดกาลเมื่อการเชื่อมต่อขาดหาย

โหมด Fallback

เมื่อ API ไม่พร้อมใช้งาน --fallback จะเขียน placeholders ที่นำหน้าด้วย [EN] แทนการแปลจริง:

npx i18n-rosetta sync --fallback
{
"hero.title": "[EN] Welcome to our platform"
}

placeholders เหล่านี้จะถูกตรวจจับโดยอัตโนมัติและแปลใหม่อีกครั้งในการซิงค์ครั้งถัดไปด้วยคีย์ API ที่ถูกต้อง ระบบจะไม่ถือว่าข้อมูลเหล่านี้ "แปลแล้ว" — audit จะทำการติดแฟล็ก (Flag) แจ้งเตือน

การทดสอบ

คุณสมบัติด้านความปลอดภัยได้รับการตรวจสอบโดยชุดการทดสอบแบบ Adversarial:

npm run test:redteam # prototype pollution, path traversal, encoding attacks

ดูเพิ่มเติม