"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > خطوات لمنع هجمات التلوث النموذجية في JavaScript

خطوات لمنع هجمات التلوث النموذجية في JavaScript

تم النشر بتاريخ 2024-07-31
تصفح:434

Steps to Preventing Prototype Pollution Attacks in JavaScript

في عالم أمن الويب، يعد تلوث النموذج الأولي ثغرة أمنية خفية ولكنها مدمرة يمكن أن تؤدي إلى عواقب وخيمة إذا لم تتم معالجتها بشكل صحيح. في هذه المدونة، سوف نستكشف ما هو النموذج الأولي للتلوث، وكيف يحدث، والأهم من ذلك، كيفية الوقاية منه. هيا بنا نتعمق!

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

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

كيف يحدث التلوث النموذجي

لفهم كيفية حدوث تلوث النماذج الأولية، نحتاج إلى إلقاء نظرة فاحصة على كائنات JavaScript والنماذج الأولية. في JavaScript، كل كائن لديه نموذج أولي، وهو كائن آخر يرث منه الكائن الأول الخصائص والأساليب. يسمح هذا التسلسل النموذجي بالبحث الفعال عن الممتلكات ولكنه يفتح الباب أيضًا لهجمات محتملة إذا لم يتم التعامل معها بشكل صحيح.

إليك مثال بسيط لكيفية حدوث التلوث الأولي:

let obj = {};
console.log(obj.constructor); // function Object() { [native code] }

obj.__proto__.polluted = true;
console.log({}.polluted); // true

في هذا المثال، من خلال تعديل خاصية proto لـ obj، فإننا نؤثر عن غير قصد على جميع الكائنات التي تشترك في نفس النموذج الأولي، مما يوضح مدى سهولة تلويث سلسلة النموذج الأولي.

مثال حقيقي للتلوث الأولي

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

const merge = require('lodash/merge');

let config = {};
let query = JSON.parse('{"__proto__":{"admin":true}}');

merge(config, query);

console.log(config.admin); // undefined
console.log({}.admin); // true

في هذا المثال، يتم استخدام وظيفة الدمج من مكتبة Lodash لدمج التكوين مع الاستعلام. ومع ذلك، يتضمن كائن الاستعلام الذي يتحكم فيه المهاجم خاصية proto التي تلوث النموذج الأولي للكائن العام، مما يؤدي إلى تعيين admin على true لجميع الكائنات.

منع التلوث النموذجي

لحماية تطبيقاتك من تلوث النماذج الأولية، فكر في تنفيذ التدابير التالية:

1. تجنب توسيع النماذج الأولية الأصلية:
لا تقم بتوسيع النماذج الأولية الأصلية (على سبيل المثال، Object.prototype) مباشرة، حيث يمكن أن يؤدي ذلك إلى تعارضات وثغرات أمنية.

مثال: تجنب توسيع النماذج الأولية الأصلية
تجنب القيام بذلك:

Object.prototype.polluted = true; // Extending native prototype

let obj = {};
console.log(obj.polluted); // true

بدلاً من ذلك، قم بإنشاء أساليب مساعدة داخل مساحة الاسم الخاصة بك:

const myUtils = {
  polluted: function() {
    // Your method implementation
  }
};

let obj = {};
console.log(obj.polluted); // undefined

2. التحقق من صحة إدخال المستخدم:
قم دائمًا بالتحقق من صحة مدخلات المستخدم وتعقيمها قبل استخدامها لإنشاء الكائنات أو تعديلها. استخدم مكتبات مثل Joi أو Validator لفرض قواعد صارمة للتحقق من صحة الإدخال.

مثال: التحقق من صحة إدخال المستخدم باستخدام Joi

const Joi = require('joi');

const schema = Joi.object({
  admin: Joi.boolean().required()
});

const input = JSON.parse('{"admin":true}');

const { error, value } = schema.validate(input);

if (error) {
  console.error('Invalid input:', error.details);
} else {
  console.log('Valid input:', value);
}

3. استخدم أساليب الكائنات الآمنة:

يفضل استخدام أساليب الكائنات الآمنة التي لا تجتاز سلسلة النموذج الأولي، مثل Object.create(null) لإنشاء كائنات عادية بدون نموذج أولي.

مثال: استخدام أساليب الكائنات الآمنة

let safeObj = Object.create(null);
safeObj.admin = false;

console.log(safeObj.constructor); // undefined
console.log(safeObj.admin); // false

4. تجميد النموذج الأولي:

قم بتجميد Object.prototype لمنع إجراء تعديلات على سلسلة النموذج الأولي. يمكن القيام بذلك باستخدام Object.freeze().

مثال: تجميد النموذج الأولي

Object.freeze(Object.prototype);

let obj = {};
try {
  obj.__proto__.polluted = true;
} catch (e) {
  console.error('Attempt to modify prototype failed:', e);
}

console.log({}.polluted); // undefined

5. تحديث التبعيات:

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

مثال: تحديث التبعيات باستخدام npm

npm update

قم بتشغيل هذا الأمر بانتظام للتأكد من أن جميع الحزم الخاصة بك محدثة.

6. المراقبة والاختبار:
تنفيذ المراقبة والاختبار الآلي لاكتشاف نقاط الضعف في التلوث في النموذج الأولي والتخفيف منها. يمكن لأدوات مثل تدقيق npm أن تساعد في تحديد الحزم الضعيفة في مشروعك.

مثال: المراقبة والاختبار باستخدام تدقيق npm

npm audit

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

خاتمة

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

إذا وجدت هذه المدونة مفيدة، فتأكد من مشاركتها مع زملائك من المطورين وعشاق الأمان. يعد البقاء على اطلاع واستباقي أمرًا أساسيًا للحفاظ على أمان الويب القوي. برمجة سعيدة!

بيان الافراج هذه المقالة مستنسخة على: https://dev.to/rigalpatel001/steps-to-preventing-prototype-pollution-attacks-in-javascript-118g?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] للحذف هو - هي
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3