Command Injection
حقن أوامر النظام Command Injection
Command Injection تحدث عندما يمرّر التطبيق مدخل مستخدم لسطر أوامر نظام التشغيل دون فصل صارم، فيتمكّن المهاجم من إلحاق أمر إضافي بجانب الأمر المقصود.
بعض الميزات تحتاج تشغيل أمر نظام (تحويل صيغة ملفّ، فحص شبكة) وتبني سطر الأمر بدمج نصّي يتضمّن مدخل المستخدم. أي رمز خاصّ بشِل النظام (فاصلة منقوطة، أنبوب، علامة و) داخل هذا المدخل قد يُفهَم كفاصل بين أمرين، فينفَّذ أمر إضافي لم يقصده المطوّر بصلاحيات العملية نفسها.
الفرق عن حقن SQL أنه يستهدف نظام التشغيل مباشرة لا قاعدة البيانات — والأثر عادة أوسع لأنه يمنح تحكّمًا بالخادم نفسه لا بالبيانات فقط.
الصياغة
exec("tool " + userInput) // ❌ دمج نصّي مباشر مع مدخل مستخدم📄 مثال
// ✅ آمن: مرّر الوسيطة كعنصر منفصل، لا كنصّ مدموج يفسَّره الشِل
const { execFile } = require("node:child_process");
execFile("convert", [inputPath, outputPath], (err, stdout) => {
// execFile لا يمرّ عبر الشِل — الوسائط لا تُفسَّر كأوامر إضافية
});أهم النقاط
| النقطة | الوظيفة |
|---|---|
| exec / system | دوال تمرّر السلسلة كاملة للشِل — أي رمز خاصّ بها يُفسَّر |
| execFile / spawn بدون shell | يمرّر البرنامج ووسائطه منفصلة — لا يمرّ عبر مفسّر الشِل إطلاقًا |
| المبدأ الوقائي | استخدم API مكتبة اللغة المباشر بدل استدعاء أداة نظام خارجية كلما أمكن |
💡 نصائح عملية
- لو لا بدّ من أمر نظام، استخدم دالة تفصل البرنامج عن وسائطه (execFile لا exec) بدل بناء سطر أمر واحد كنصّ
⚠️ أخطاء شائعة
- الاكتفاء بحظر رموز معيّنة (قائمة سوداء) بدل تجنّب تمرير المدخل عبر مفسّر الشِل أصلًا — قائمة الرموز الخطرة أطول ممّا يبدو
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CYBERSECURITY الكامل بالعربي.