تخطي للذهاب إلى المحتوى

تلويث النموذج الأولي: القاتل الصامت في كود JavaScript الخاص بك

4 يناير 2026 بواسطة
تلويث النموذج الأولي: القاتل الصامت في كود JavaScript الخاص بك
Ibrahim Zakaria


أمن JavaScript في العالم الحقيقي: ما لا تعلّمك إياه الجامعات

JavaScript في كل مكان.

تشغّل المواقع ولوحات التحكم وتطبيقات الهاتف، وحتى الأنظمة الخلفية. إذا كنت تبني برمجيات اليوم، فأنت تستخدم JavaScript، شئت أم أبيت.

لكن هنا تكمن المشكلة.

يتعلّم معظم المطوّرين كيف يجعلون JavaScript تعمل، لا كيف يجعلونها آمنة.

في جامعات بيروت وفي أنحاء لبنان، تركّز مقررات JavaScript غالبًا على الصياغة والمنطق الأساسي والمشاريع البسيطة. أما المخاطر الأمنية في JavaScript وأفضل الممارسات في العالم الحقيقي فغالبًا ما تُهمَل.

من أخطر الأمثلة ثغرة تُسمّى Prototype Pollution (تلويث النموذج الأولي): مشكلة أمنية لم يسمع بها كثير من المطوّرين، لكنها قادرة على تعطيل تطبيق بالكامل.

في هذا المقال نشرح تلويث النموذج الأولي بطريقة واضحة وبسيطة، ونبيّن لماذا هو خطير، وكيف يحمي المطوّرون تطبيقاتهم باتباع أفضل ممارسات الأمان في JavaScript.

فهم النماذج الأولية في JavaScript (بعبارات بسيطة)

تعمل JavaScript بطريقة مختلفة عن كثير من لغات البرمجة الأخرى.
فبدل الوراثة التقليدية، تستخدم JavaScript النماذج الأولية (prototypes).

يمكن لكل كائن في JavaScript أن يرث خصائص من كائن آخر يُسمّى النموذج الأولي له. عندما تحاول الوصول إلى خاصية:

  1. تبحث JavaScript في الكائن نفسه
  2. إن لم تجدها، تبحث في النموذج الأولي
  3. ويستمر ذلك حتى تصل إلى Object.prototype

هذا التصميم قوي، لكنه محفوف بالمخاطر أيضًا.
إذا تمكّن أحدهم من تعديل Object.prototype، فبإمكانه التأثير في كل كائن في تطبيقك.
وهنا يصبح تلويث النموذج الأولي خطيرًا.

ما هو تلويث النموذج الأولي؟

يحدث تلويث النموذج الأولي عندما يحقن المهاجم خصائص في Object.prototype.

عندما يحدث ذلك:

  • قد يرث كل كائن في تطبيقك قيمًا خبيثة
  • قد تفشل عمليات التحقق الأمنية بصمت
  • قد يُتجاوَز منطق العمل دون أي خطأ ظاهر

هذا النوع من الثغرات صعب الملاحظة، وتصحيحه أصعب.

مثال حقيقي: الدمج غير الآمن للكائنات

تدمج كثير من تطبيقات JavaScript مدخلات المستخدم مع كائنات الإعدادات الافتراضية.

قد تبدو دالة دمج بسيطة هكذا:

function merge(target, source) {
  for (let key in source) {
    if (typeof target[key] === 'object' && target[key] !== null) {
      merge(target[key], source[key]);
    } else {
      target[key] = source[key];
    }
  }
}

تخيّل الآن أن مهاجمًا أرسل هذه المدخلات:

{
  "__proto__": {
    "isAdmin": true
  }
}

ماذا يحدث؟
بدل إضافة خاصية عادية، تعدّل JavaScript النموذج الأولي نفسه.

وفجأة يصبح لدى كل كائن في نظامك:

isAdmin === true

لماذا يُعدّ هذا خطرًا أمنيًا جسيمًا

ما إن يقع تلويث النموذج الأولي حتى يصبح الأثر شديدًا:

  • تجاوز المصادقة
    إذا كان كودك يتحقق من الصلاحيات باستخدام if (user.isAdmin)، فقد يحصل المهاجمون على صلاحيات المدير.
  • سلوك غير متوقع
    ينكسر المنطق بطرق يصعب تتبّعها.
  • انهيار النظام أو حجب الخدمة
    يمكن الكتابة فوق خصائص حيوية.

هذا ليس كلامًا نظريًا. فقد وقعت هذه الهجمات في أنظمة إنتاج حقيقية.

أفضل ممارسات الأمان في JavaScript لمنع تلويث النموذج الأولي

1. لا تثق أبدًا بمدخلات المستخدم

تحقّق دائمًا من البيانات الواردة ونقّها.

ارفض الكائنات التي تحتوي على مفاتيح خطرة مثل __proto__ أو constructor أو prototype.

function sanitize(obj) {
  if (obj.__proto__) {
    throw new Error("Prototype pollution detected");
  }
  for (let key in obj) {
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      sanitize(obj[key]);
    }
  }
}

2. استخدم Object.create(null) متى أمكن

الكائنات المُنشأة بهذه الطريقة لا ترث من Object.prototype.

const safeObject = Object.create(null);
safeObject.key = "value";

هذه التقنية البسيطة قادرة على القضاء على فئات كاملة من الهجمات.

3. احذر عند استخدام المكتبات

حتى المكتبات الشائعة يمكن أن يُساء استخدامها.

إذا كنت تستخدم أدوات مثل lodash.merge، فاحرص دائمًا على:

  • تحديثها باستمرار
  • تنقية المدخلات قبل الدمج
  • اتباع أفضل ممارسات الأمان الموثّقة

4. جمّد النماذج الأولية (بحذر)

Object.freeze(Object.prototype);

يمنع هذا أي تعديل على النماذج الأولية تمامًا، لكنه قد يعطّل بعض المكتبات. استخدمه بحذر.

لماذا لا يتعلّم معظم المطوّرين هذا في الجامعة

نادرًا ما يُدرَّس هذا المستوى من أمن JavaScript في البرامج الأكاديمية.

تركّز الجامعات على:

  • الصياغة البرمجية
  • الامتحانات
  • المشاريع البسيطة

أما البرمجيات في العالم الحقيقي فتتطلّب:

  • التفكير الأمني
  • فهم الهجمات
  • عادات البرمجة الدفاعية
  • أفضل الممارسات في القطاع

هذه الفجوة تحديدًا هي ما تعالجه NavyBits من خلال Winners Academy.

تعلّم أمن JavaScript الحقيقي في Winners Academy

في Winners Academy يتعلّم المطوّرون:

  • ثغرات أمنية حقيقية في JavaScript
  • كيف يفكّر المهاجمون
  • أفضل ممارسات البرمجة الآمنة
  • مهارات تُستخدم في الشركات الحقيقية، لا في الكتب

سواء كنت طالبًا أو مطوّرًا مبتدئًا أو محترفًا في بيروت أو في أي مكان في لبنان، فإن تعلّم JavaScript مع التركيز على الأمان سيميّزك عن غيرك.

لأن كتابة الكود لم تعد كافية.

كتابة كود آمن هي ما يجعلك محترفًا.

خلاصة القول

تلويث النموذج الأولي مجرد مثال واحد على أهمية أمن JavaScript.

إذا أردت أن تبني تطبيقات جادة، وتعمل على مشاريع حقيقية، وتتطوّر كمطوّر، فأنت بحاجة إلى معرفة تتجاوز محاضرات الجامعة.

هذا هو الفرق بين تعلّم JavaScript وإتقان JavaScript بالطريقة الصحيحة.

اكتشف مسارات التعلّم في NavyBits Winners Academy وابنِ مهارات تحمي الأنظمة الحقيقية فعلًا.

تلويث النموذج الأولي: القاتل الصامت في كود JavaScript الخاص بك
Ibrahim Zakaria 4 يناير 2026
شارك هذا المنشور
علامات التصنيف
راسلنا على واتسابوكيل ذكي يردّ على مدار الساعة
احجز مكالمة مجانية