تخطي إلى المحتوى الرئيسي

الأمن والسلامة

تم تصميم Rosetta ليكون آمناً في البيئات المعادية — حيث قد تأتي بيانات اللغة (locale) من مصادر غير موثوقة، وحيث يمكن لأسماء الملفات المصممة خصيصاً تجاوز حدود الدلائل (directories)، وحيث يمكن أن تحتوي مخرجات LLM على أي شيء.

نموذج التهديد

التهديدمسار الهجومالتخفيف
تلوث النموذج الأولي (Prototype pollution)مفاتيح JSON مصممة خصيصاً (__proto__، constructor)تُرفض وقت التحليل (parse time)
تجاوز المسار (Path traversal)رموز لغة مثل ../../etc/passwdيتم التحقق من كتابة الملفات في الدلائل المكونة
تلف كتل التعليمات البرمجيةيقوم LLM بالترجمة داخل حدود التعليمات البرمجيةالحماية باستخدام حراس Unicode (Unicode sentinel)
المفاتيح المهلوسة (Hallucinated keys)يُرجع LLM مفاتيح لم يتم إرسالهاالتحقق من الاستجابة — تتم كتابة المفاتيح المقبولة فقط
استهلاك الرموز (tokens) الخارج عن السيطرةحلقات إعادة المحاولة اللانهائيةالحد الأقصى للميزانية عبر maxRetries

الحماية من تلوث النموذج الأولي (Prototype Pollution Guard)

يتم التحقق من جميع مفاتيح اللغة مقابل قائمة حظر قبل المعالجة:

  • __proto__
  • constructor
  • prototype

يتم رفض أي مفتاح يطابق هذه الأنماط مع ظهور خطأ. يمنع هذا المهاجمين من استخدام ملفات لغة مصممة خصيصاً لتعديل النماذج الأولية لكائنات JavaScript.

احتواء المسار

عند كتابة ملفات اللغة، يتحقق rosetta من بقاء مسار المخرجات داخل الدلائل المكونة (localesDir، contentDir). يتم تعقيم رموز اللغة — لا يمكن لرمز مثل ../../secrets الكتابة خارج الدليل المتوقع.

حماية الكتل

أثناء ترجمة محتوى Markdown، يتم استبدال العناصر المهيكلة بعناصر نائبة حارسة من Unicode (Unicode sentinel) قبل إرسال النص إلى LLM:

  1. كتل التعليمات البرمجية (المحاطة والمضمنة) → حارس (sentinel)
  2. أكواد Hugo القصيرة (shortcodes) ({{< >}}، {{% %}}) → حارس (sentinel)
  3. HTML الخام → حارس (sentinel)
  4. متغيرات الاستيفاء (Interpolation variables) ({{ .Count }}) → حارس (sentinel)

بعد الترجمة، يتم استبدال الحراس بالمحتوى الأصلي. لا يرى LLM أبداً كتل التعليمات البرمجية أو الأكواد القصيرة أو HTML — لذا لا يمكنه إتلافها.

التحقق من الاستجابة

عندما يُرجع LLM استجابة JSON، يتحقق rosetta مما يلي:

  • ظهور المفاتيح التي تم إرسالها في الدفعة فقط في الاستجابة
  • عدم حقن أي مفاتيح إضافية
  • إمكانية تحليل الاستجابة كـ JSON صالح

يتم إسقاط المفاتيح المهلوسة بصمت. يمنع هذا مخرجات LLM من حقن ترجمات غير متوقعة في ملفات اللغة الخاصة بك.

بوابة الجودة (Quality Gate)

يتم التحقق من كل ترجمة من خلال خمسة فحوصات حتمية قبل كتابتها على القرص. راجع بوابة الجودة للحصول على التفاصيل.

التراجع الأسي (Exponential Backoff)

تستخدم استدعاءات API التراجع الأسي مع التذبذب (jitter) عند تلقي استجابات 429 (حد المعدل) و 5xx (خطأ في الخادم). تمنع ثلاث محاولات إعادة مع تأخير متزايد الضغط الزائد على API أثناء فترات الانقطاع.

مهلة الطلب

يحتوي كل طلب API على مهلة قدرها 30 ثانية عبر AbortController. يمنع هذا عملية المزامنة من التعليق إلى أجل غير مسمى بسبب اتصال ميت.

الإخفاقات الصريحة للترجمة (Fail-Loud)

عندما تكون API غير متاحة أو تفشل الترجمة، يُصدر rosetta خطأً صريحاً مع إرشادات قابلة للتنفيذ بدلاً من كتابة بيانات غير صالحة بصمت. لا تتم كتابة أي عناصر نائبة مسبوقة بـ [EN] أثناء المزامنة.

[ERR] Content sync for fr: no API key available.
Set OPENROUTER_API_KEY in .env.local to translate content.

لا يؤدي فشل ملف واحد إلى إيقاف المزامنة بأكملها — يتم تسجيل الخطأ ويستمر مسار العمل (pipeline) إلى الملف التالي، مما يضمن تحقيق أقصى تقدم في كل تشغيل.

التحقق ما بعد المزامنة

بعد اكتمال جميع الترجمات، يعيد rosetta قراءة ملفات اللغة المكتوبة من القرص ويُجري دورة تحقق. يكتشف هذا الفجوة بين إبلاغ المزامنة بالنجاح وكون الترجمات خاطئة في الواقع:

  • تكافؤ المفاتيح (Key parity) — جميع مفاتيح المصدر موجودة في كل هدف
  • علامات [EN] — علامات التراجع القديمة من عمليات التشغيل السابقة
  • الترجمات الفارغة — القيم الفارغة التي تسربت
  • التوافق مع النص (Script compliance) — اللغات غير اللاتينية التي تحتوي على ترجمات ASCII فقط
  • الحفاظ على العناصر النائبة — تطابق العناصر النائبة لـ ICU مع المصدر

يمكنك التخطي باستخدام --no-verify أو التشغيل بشكل مستقل باستخدام npx i18n-rosetta verify.

الاختبار

يتم التحقق من خصائص الأمان بواسطة مجموعة الاختبارات المعادية:

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

انظر أيضاً