بناءا على طلب الأخ العزيز Night Rider قمت بكتابة بعض النصائح التي تذكرتها حول حماية برامج ويب من مشاكل الاختراق .. ولا تنسوا بأن الجميع مدعو للمشاركة بإضافة النصائح التي يعرفها.
من أكبر المشاكل التي تواجهنا عند التعامل مع برامج الويب هو الثقة بالمعلومات التي تأتي من الخارج .. يعني بأن البرنامج يقبل أي معلومة يأخذها من المستخدم دون التحقق منها، حتى يكون الموضوع أوضح فهما سأحاول كتابة عدد من الأمثلة، كل منها يحتوي على ثغرة أمنية وبعدها شرح للثغرة وكيفية التخلص منها :
المثال الأول : لنفرض بأنك تريد كتابة برنامج يقوم بأخذ معلومة من المستخدم هي الاسم مثلا، وبعد ذلك نريد عمل استعلام بلغة SQL لإضافة الاسم إلى قاعدة البيانات، حتى يكون الشرح عاما لن نحدد لغة برمجية ما، ولكن ( حسب لغة البرمجة التي تستخدمها ) يجب في النهاية أن تكون استعلاما شبيها بالتالي :
كود:
INSERT INTO names (name) VALUES('new_name');
بحيث تكون new_name الموضحة بالخط العريض في الأعلى هي المتغيرة التي تحتوي على الاسم الذي أدخله المستخدم، كيف تضع محتوى المتغيرة في وسط الاستعلام هي مهمة تختلف حسب لغة البرمجة التي تستخدمها المهم أن الكلمة new_name سيتم استبدالها بأي معلومة يدخلها المستخدم وإرسال الاستعلام إلى مزود قواعد البيانات للتنفيذ .. فإذا أدخل المستخدم الاسم mubarmej سيقو برنامج بتكوين الاستعلام التالي وإرساله للتنفيذ :
كود:
INSERT INTO names (name) VALUES('mubarmej');
حسنا .. ماذا لو أدخل المستخدم العبارة ( I'm mubarmej ) في خانة الاسم؟ أنظر الآن إلى الاستعلام :
كود:
INSERT INTO names (name) VALUES('I'm mubarmej');
كما هو واضح فالاستعلام السابق غير صحيح، وسيعيد برنامج قواعد البيانات خطئا يفيد عدم صحة الاستعلام .. قد لا تكون مشكلة كبيرة بالنسبة لك ولكن ماذا لو كان الشخص الذي قام بالخطأ مخترقا؟ وأن العبارة التي أدخلها كاسم له هي العبارة التالية :
كود:
'; DELETE FROM names ;
حسنا دعننا ننظر ما الذي سيحدث الآن :
كود:
INSERT INTO names (name) VALUES(' '; DELETE FROM names ;');
في المرة الأخيرة فإن برنامجك سيرسل إلى البرنامج ثلاثة استعلامات سيراها مزود قواعد البيانات هكذا :
كود:
INSERT INTO names (name) VALUES(' ';
DELETE FROM names ;
');
الاستعلام الآن سيحتوي على خطأ ولن ينفذ، وكذلك بالنسبة للاستعلام الأخير، ولكن الاستعلام الذي في المنتصف هو الأهم، لأنه استعلام صحيح وسيتم تنفيذه، إذا لم تكن لديك خبرة في لغة SQL فهذا الاستعلام يقوم بحذف جميع الحقول المخزنة في الجدول names، يعني ستفقد جميع الأٍسماء التي تم إدخالها مسبقا!
طبعا .. قس على ذلك إمكانية حذف جميع المساهمات في أحد ساحات الحوار !
حل المشكلة :
لحل هذه المشكلة يجب أن تقوم بتمرير البيانات التي تحصل عليها من الخارج عبر فلاتر خاصة لتحويل العلامات ( ' ) إلى العلامات ( \' ) أو ( '' ) حسب الطريقة التي يتبعها برنامج قواعد البيانات الذي تستخدمه.
في لغة PHP وحسب الاختيارات الافتراضية فإن جميع البيانات التي تدخل على البرنامج من الخارج تكون جاهزة للوضع في قواعد البيانات، ولكن هذه الميزة قد تكون مطفئة، لا تعتمد عليها كثيرا في برامجك، في الواقع فإن اغلب المستضيفات تقوم بإغلاق هذه الميزة لأنها غير واقعية.