لا تكتب كلمة مرور مدير قاعدة البيانات في الكود

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

المبرمج عادة يجعل مستخدم واحد لقراءة البيانات و تعديلها و إدارتها، و هذا خطأ.


ما حل تلك المشكلة؟

يجب إنشاء مستخدم (مستخدم في قاعدة البيانات، يمكنك أن تبحث عن MySQL User Account Management لو تستعمل MySQL) لقراءة المحتوى و ربما إنشاء تعليقات فقط، أي صلاحيات أساسية جدا يسمح لمستخدم الموقع القيام بها.

و مستخدم آخر كمدير للمحتوى في خادم قاعدة البيانات و هو فقط من له صلاحية الإضافة و التعديل و الحذف في المحتوى.

لكن لا يجب وضع كلمة مرور ذلك المستخدم المدير في الكود لأن المخترق لو استطاع تصفح محتوى كود الموقع سيحصل على كلمة المرور بسهولة و يعدل على المحتوى.

إذا يجب برمجة نظام يطلب كلمة مرور حساب المدير في الموقع (هنا أعني حساب في الموقع و ليس في خادم قاعدة البيانات)، و لما تكون كلمة المرور صحيحة يدخل إلى صفحة الإدارة لكن بالمستخدم العادي في قاعدة البيانات الذي لا يقدر على التعديل، و لكي يعدل المدير الذي دخل للتو يجب عليه إدخال كلمة مرور المستخدم الخاص بقاعدة البيانات الذي يقدر على التعديل في كل مرة يريد أن يعدل لكي يعمل استعلام أو أمر التعديل.


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

  • استعمال HTTPS.

  • إعطاء صلاحية القراءة فقط لكود الموقع المصدري، هذا يمكن أن يمنع المخترق من تعديل كود صفحة دخول المدير و إرسال كلمة مرور مدير قاعدة البيانات لما يدخلها.

  • استعمال خادم و برمجيات آمنة و محدثة.

  • استعمال Two-Factor Authentication للدخول إلى صفحة المدير، مثلا يجب إدخال كود تم إرساله عبر SMS إلى هاتف المدير.

  • إخفاء عنوان صفحة دخول المدير في الموقع عبر جعلها في ملف اسمه طويل و معقد مثل (site/b8218e0dca7337500a2726429c71a75aa34f6e1f)، لكن سيعرف المخترق مكان الصفحة لو استطاع تصفح الكود :-)

  • يجب أن يدخل المدير من حاسوب نظيف و أمن، ما الفائدة من كل هذا إن كان في جهازك من يتجسس عليك؟


ما رأيك بهذه الطريقة و كيف يمكن تحسينها؟


يمكنك وضع كلمة المرور في ملف على السيرفر خارج مجلد الجذر حيث يكون هذا الملف غير قابل للوصول من خلال الويب ومن ثم قم بقراءة كلمة المرور من ذلك الملف عند الحاجة إليها.

أعتقد أن هذه الطريقة أكثر أمانا من طلبها من المستخدم عند كل عملية.

لكن ما الذي سيمنع المهاجم من جلب ذلك الملف؟

أين يقع ذلك الملف؟ في حاسوب آخر في على الشبكة المحلية و يجلب كلمة المرور عبر اتصال HTTP ؟

هل وضع كلمة المرور في مكان ما أكثر أمان من عدم وضعها أصلا؟

الفكرة لا بأس بها، الأمان سيعتمد على أمان ذلك الخادم الآخر (ربما فكرتك مشابه لفكرة u/mohamed-akef حول الـ API)، و يمكن تحسينها قليلا و إضافة لها 2FA .

أقصد وضع الملف خارج المجلد الرئيسي القابل للوصول من خلال الويب مثل وضعه خارج مجلد www او public_html ثم تقوم بقرائتها من ذلك الملف.

لنفرض أن اسم ذلك الملف هو config.ini

وأن صفحة الphp موجودة على المجلد الرئيسي مباشرة

عندها سنقوم بقراءة محتوى ملف config.ini بالشكل التالي

$config = parse_ini_file('../config.ini');

أما بخصوص الشق الثاني فمن وجهة نظري أن وضعها في مكان آمن أفضل من إرسالها عند كل عملية حيث أنه حتى بروتوكول https لم يعد آمن تماما.

كما ذكرت سابقا الفكرة لا باس بها و هي بأمان مناسب، لكن هل عيبها أن الكلمة ممكن كشفها لو وجدت ثغرة تمكن من قراءة ملف ما في الخادم (file inclusion vulnerability) ؟

حتى بروتوكول https لم يعد آمن تماما.

هذا يعتمد على الشهادة التي في جهاز المدير حيث لا يخدع بموقع مزيف، خوارزميات التشفير المستعملة، مكتبة الـ TLS، ...

هذا صحيح