مشكلة في الحماية في دورة جوناس للـ Nodejs

السلام عليكم ورحمة الله وبركاته

وقت القراءة: أقل من 5 دقائق

المقدمة

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

توضيح المشكلة

في كلاس APIFeatures لدينا دالة تسمى limitFields والتي تقوم بتحديد الحقول التي نريدها ان ترجع من قاعدة البيانات

limitFields() {
  let fields = this.queryOptions.fields;
  if (!fields) return this;

  fields = fields.split(',').join(' ');
  this.query = this.query.fields(fields);
  return this;
}

وشكل الـ query كان بسيط بهذا الشكل /users?fields=name,country، هكذا كان سيرجع لنا اسم ودولة جميع المستخدمين

{
  "status": "success",
  "results": 2,
  "data": [
    {
      "name": "Ahmed Mostafa",
      "country": "Egypt"
    },
    {
      "name": "Kamal Ali",
      "country": "Palestine"
    }
  ]
}

لكن عندما تحدد كلمة السر في الـ query بهذا الشكل /users?fields=password، سيقوم بإرجاع كلمة السر لجميع المستخدمين

{
  "status": "success",
  "results": 2,
  "data": [
    {
      "password": "16$2a$12$Z3Q4QXJ5"
    },
    {
      "password": "79$Z3Q4QXJ5$2a$12"
    }
  ]
}

وهذه بالطبع تعد مشكلة كبيرة في الحماية، حتى وإن كانت كلمات السر مشفرة أو معمولة لها hash، لأنها لا تزال تعد معلومة حساسة يجب ألا يتم ارجاعها لأي شخص يستخدم الـ API، حتى وإن كان من ضمن فريق تطوير المشروع

لانه يمكن لأي شخص إذا حصل عليها أن يقوم بعمل بعض الخوارزميات كـ Brute Force أو أي طريقة أخرى لمحاولة اختراق حسابات المستخدمين

حل المشكلة

الحل بسيط جدًا، فقط ضع شرط بسيط في دالة limitFields للتأكد من عدم وجود كلمة password في الـ query

limitFields() {
  let fields = this.queryOptions.fields;
  if (!fields) return this;

  fields = fields.split(',').join(' ');

  // query في الـ password التأكد من عدم وجود كلمة
  if (fields.includes('password'))
    throw 'Invalid selected fields in query';

  this.query = this.query.select(fields);
  return this;
}

لاحظ كم أن الحل بسيط وسهل لكن أثره كبير جدًا وحل مشكلة كبيرة في الحماية

هذه كانت مجرد مشكلة لاحظتها في دورة جوناس للـ Nodejs وأردت التنبيه عليها
لا تتردد في مشاركة هذه المعلومات مع الأشخاص الآخرين لكي يتمكنوا من تجنب هذه المشكلة