الثغرات الأمنية التي يطلقها مطورو Node.js في بيئة الإنتاج

قمت بمراجعة كود برمجي لإحدى الشركات الناشئة العام الماضي. بدا الكود نظيفاً، واجتازت الاختبارات بنجاح.

ثم رأيت هذا السطر: const query = SELECT * FROM users WHERE email = '${req.body.email}'``

هذه ثغرة SQL injection. استمرت الشركة الناشئة في تشغيل هذا الكود في بيئة الإنتاج لمدة 8 أشهر، ولم يكتشفها أي مطور أو مدير تقني (CTO).

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

توقف عن ارتكاب هذه الأخطاء الخمسة الشائعة:

  1. استخدام SQL الخام مع مدخلات المستخدم لا تستخدم template literals للاستعلامات، فهذا يسمح للمهاجمين بالوصول إلى قاعدة بياناتك.
  • سيء: const query = SELECT * FROM users WHERE email = '${email}'``
  • جيد: استخدم parameterized queries. const query = 'SELECT * FROM users WHERE email = $1' db.query(query, [email])
  1. تسريب الأسرار في Git غالباً ما يقوم المطورون برفع ملفات .env إلى المستودعات (repositories). هذا يكشف روابط قواعد البيانات ومفاتيح الـ API الخاصة بك. احرص دائماً على إضافة .env إلى ملف .gitignore الخاص بك.

  2. استخدام jwt.decode بدلاً من jwt.verify يقوم jwt.decode فقط بقراءة الرمز (token)، لكنه لا يتحقق مما إذا كان الرمز حقيقياً أم لا. يمكن لأي شخص تزوير رمز تم فك تشفيره.

  • سيء: const user = jwt.decode(token)
  • جيد: تحقق دائماً من التوقيع (signature). const user = jwt.verify(token, process.env.JWT_SECRET)
  1. غياب تحديد معدل الطلبات (rate limiting) في نقاط نهاية المصادقة (auth endpoints) بدون تحديد معدل الطلبات، يمكن للمهاجمين تجربة ملايين كلمات المرور عبر هجمات القوة الغاشمة (brute force). استخدم مكتبة لتحديد محاولات تسجيل الدخول.
  • جيد: أضف حداً أقصى قدره 10 محاولات كل 15 دقيقة.
  1. رسائل الخطأ التفصيلية إرسال رسائل الخطأ الخام إلى العميل يساعد المهاجمين على رسم خريطة لنظامك، حيث يمكنهم رؤية أسماء الجداول وأنواع قواعد البيانات.
  • سيء: res.status(500).json({ error: error.message })
  • جيد: قم بتسجيل الخطأ داخلياً، وأرسل رسالة عامة للمستخدم. res.status(500).json({ error: 'Something went wrong' })

قبل أن تطلق أي نقطة نهاية (endpoint)، اسأل نفسك سؤالاً واحداً: ماذا سيحدث إذا أرسل المستخدم بيانات غير متوقعة؟

الثغرات الأمنية نادراً ما تكون معقدة. إنها تحدث عندما تنسى التفكير في الأشخاص السيئين (bad actors).

ما هي الثغرة الأمنية التي وجدتها في بيئة الإنتاج؟

المصدر: https://dev.to/manolito99/the-security-bug-every-nodejs-developer-ships-to-production-49e6