يستغل هجوم تلوث النموذج الأولي الطريقة التي تتعامل بها كائنات JavaScript مع النماذج الأولية المقابلة لها. في JavaScript، النماذج الأولية هي كائن آخر يحدد الخصائص والأساليب الافتراضية للكائن المحدد. يستغل المهاجم تلوث النموذج الأولي عن طريق حقن تعليمات برمجية ضارة في هذه النماذج الأولية عن طريق معالجة خصائص الكائن أو باستخدام وظيفة تقوم بدمج الكائنات بشكل متكرر.
يشرح هذا الدليل طرق منع هجمات التلوث النموذجية.
منع هجمات التلوث النموذجية؟
السبب الجذري لهجمات تلوث النموذج الأولي هو أن كائنات JavaScript ترث خصائص من نموذجها الأولي. وهذا يعني أنه إذا تمكن أحد المهاجمين من حقن تعليمات برمجية ضارة في النموذج الأولي، فسوف ترثها جميع الكائنات التي ورثت من هذا النموذج الأولي. ويؤدي ذلك إلى سرقة البيانات، أو تنفيذ تعليمات برمجية عشوائية، أو السيطرة على التطبيقات الأخرى.
في مقتطف الكود أدناه، سيتم إدخال كود التلوث الأولي:
ثابت ص = { أ: 1 ، ب: 2 } ;
بيانات ثابتة = JSON.parse ( '{'__proto__': { 'خاطئ': صحيح}}' ) ;
const c = Object.sign ( { } ، و البيانات ) ;
console.log ( ج. معيب ) ;
وصف مقتطف الكود أعلاه:
-
- أولا القائمة المسماة ' و يتم إنشاؤه ويقوم بتخزين القيم في زوج القيمة الرئيسية.
- بمساعدة ' -لذلك- '، يتم تنفيذ الكود الملوث العشوائي بتنسيق قيمة المفتاح. تم ضبط المفتاح على ' متعطل 'والقيمة المخصصة ل' حقيقي '.
- ثم يتم تعيين هذا الكود الملوث إلى ' و 'القائمة عن طريق استدعاء' تعيين() '، ويتم تخزين القائمة الناتجة في قائمة جديدة تسمى ' ج '.
- وأخيرًا، الكود الملوث الذي تم إدخاله في ' ج يتم استرداد القائمة ويتم عرض قيمتها على وحدة التحكم. للتأكد من أنه تم حقن التلوث أو البيانات الضارة.
بعد تنفيذ الملف المحتوي، تظهر النتيجة أنه تم حقن الكود الخبيث بنجاح وتم استرداد قيمته:
كيفية منع هجمات التلوث النموذجية؟
هناك عدة طرق يمكن من خلالها منع هجوم التلوث النموذجي:
عمليات الدمج العودية غير الآمنة:
تجنب عمليات الدمج العودية غير الآمنة لأنها يمكن أن تؤدي إلى هجمات تلوث نموذجية:
حيث الدمج = ( يأخذ ، سرك ) = > {ل ( سمات فار في src ) {
لو ( نوع من ( يأخذ [ صفات ] ) === 'الكائن' && نوع من ( src [ صفات ] ) === 'الكائن' )
{
دمج ( يأخذ [ صفات ] ، سرك [ صفات ] ) ;
} آخر {
يأخذ [ صفات ] = سرك [ صفات ] ;
}
}
يعود يأخذ ;
} ;
في الكود أعلاه:
-
- أولا، الوظيفة المخصصة ' دمج() 'يتم إنشاؤه يقبل معلمتين للصفيف' يأخذ ' و ' src '.
- المعززة ' ل 'يتم استخدام الحلقة لتكرار المتغير' صفات 'على ما هو مقدم' src ' معامل.
- داخل الحلقة، استخدم ' لو عبارة '' التي تتنقل عبر كلا الخطأين وإذا كان أي عنصر موجود في كلا المصفوفتين له نفس نوع البيانات. ثم يتم تمرير هذه العناصر كمعلمات إلى نفس ' دمج() وظيفة خلق طبيعة متكررة.
- إذا لم تكن الأنواع متماثلة، فإن قيمة العنصر الموجودة في ' src 'يتم تمرير مجموعة المعلمات إلى' يأخذ ' معامل.
- وأخيرا، فإن ' يأخذ 'يتم إرجاع المصفوفة البارامترية.
تجميد النموذج الأولي
هناك طريقة أخرى للوقاية من هجمات التلوث النموذجية وهي تجميد دورة تنفيذها. ويتم ذلك عبر ' كائن.تجميد () ' طريقة. في المقتطف أدناه، سيتم تجميد الكود الملوث النموذجي الذي تم إدخاله أعلاه:
ثابت ص = { أ: 1 ، ب: 2 } ;بيانات ثابتة = JSON.parse ( '{'__proto__': { 'خاطئ': صحيح}}' ) ;
const c = Object.sign ( { } ، و البيانات ) ;
console.log ( ج. معيب ) ;
console.log ( Object.freeze ( ج. معيب ) ) ;
console.log ( Object.isFrozen ( ج. معيب ) ) ;
شرح الكود أعلاه موضح أدناه:
-
- في البداية، سيتم إدراج التعليمات البرمجية الملوثة للنموذج الأولي الوهمي في القائمة الوهمية ' و 'تمامًا كما هو موضح في القسم أعلاه.
- ثم المفتاح الملوث المحقون ' متعطل '' يتم تمريره إلى'' تجميد () طريقة تجميد الجزء الملوث.
- وأخيرا، لتأكيد الجزء التلوث النموذجي المجمد. ال ' متعطل 'مفتاح القائمة' ج '' يتم تمريره إلى'' مجمد() ' طريقة. ترجع هذه الطريقة ' حقيقي 'في حالة المجمدة و' خطأ شنيع 'في حالة إلغاء التجميد:
بعد تنفيذ الكود المحتوي، يظهر الناتج أن حقن وتجميد والتحقق من الكود الملوث المجمد:
نصائح إضافية لمنع هجوم التلوث النموذجي
فيما يلي بعض النصائح الإضافية التي يمكن من خلالها منع هجوم التلوث النموذجي:
-
- خيار ' -تعطيل بروتو ' يمكن استخدامه لتعطيل أو إنهاء عمل ' النموذج الأولي.__proto__ ' ملكية.
- لا تستخدم الأساليب بمساعدة ' النموذج المبدئي '.
- بواسطة ' تطهير مدخلات المستخدم ' والذي يتضمن التحقق من صحة مدخلات المستخدم وتصفيتها لإزالة أي تعليمات برمجية ضارة أو ملوثة.
- استخدام ' القائمة البيضاء '، وهي قائمة بالخصائص والأساليب المسموح بها لكائن ما. سيتم حظر أي محاولات لتعيين أو الحصول على خصائص أو أساليب ليست عضوًا في القائمة البيضاء.
يتعلق الأمر كله بمنع هجمات التلوث النموذجية في Node.js.
خاتمة
لمنع هجمات تلوث النموذج الأولي، هناك أساليب مثل تجنب عمليات الدمج المتكررة غير الآمنة، وتجميد النموذج الأولي، واستخدام القائمة البيضاء لمنع ' __لذلك__ يمكن استخدام الخاصية التي تم ضبطها. إلى جانب الاستفادة من ' -تعطيل بروتو 'الخيارات، وتجنب استخدام' Object.prototype '، و ' تعقيم مدخلات المستخدم 'للرمز الملوث. يوضح هذا الدليل كيفية منع هجمات التلوث النموذجية في Nodejs.