مشكلة في الحماية في دورة جوناس للـ Nodejs
السلام عليكم ورحمة الله وبركاته
المقدمة
في دورة جوناس لتعلم برمجة 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
وأردت التنبيه عليها
لا تتردد في مشاركة هذه المعلومات مع الأشخاص الآخرين لكي يتمكنوا من تجنب هذه المشكلة