الانتقال إلى المحتوى الرئيسي

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

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

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

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

الحماية من تلويث النموذج الأولي

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

  • __proto__
  • constructor
  • prototype

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

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

عند كتابة ملفات الترجمة المحلية، يتحقق champollion من أن مسار الإخراج يبقى ضمن المجلدات المُعدّة (localesDir، contentDir). تُنقّى رموز اللغات — فرمز مثل ../../secrets لا يمكنه الكتابة خارج المجلد المتوقع.

حماية الكتل

أثناء ترجمة محتوى Markdown، تُستبدل العناصر المهيكلة بعلامات حدّية مؤقتة بترميز Unicode قبل إرسال النص إلى نموذج اللغة الكبير:

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

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

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

عندما يُعيد نموذج اللغة الكبير استجابة JSON، يتحقق champollion من أن:

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

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

بوابة الجودة

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

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

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

مهلة الطلب

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

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

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

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

فشل ملف واحد لا يوقف المزامنة بأكملها — يُسجَّل الخطأ ويواصل خط المعالجة إلى الملف التالي، بحيث تحصل على أقصى تقدم ممكن في كل تشغيل.

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

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

  • تطابق المفاتيح — جميع مفاتيح المصدر موجودة في كل هدف
  • علامات [EN] — علامات احتياطية قديمة من عمليات تشغيل سابقة
  • الترجمات الفارغة — قيم فارغة تسللت عبر العملية
  • الامتثال للنظام الكتابي — لغات غير لاتينية بترجمات تقتصر على أحرف ASCII
  • الحفاظ على العناصر النائبة — تطابق عناصر ICU النائبة مع المصدر

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

الاختبار

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

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

انظر أيضًا