ط§ط³ط§ط³ظٹط§طھ ط§ظ„ط¨ط±ظ…ط¬ط© ط§ظ„ط§ظ…ظ†ط© ظپظٹ ظ„ط؛ط© PHP






الملخص

في هذا المقال تم استعراض أهم الأساسيات والأمور التي يجب مراعاتها أثناء برمجة أي تطبيق بلغة PHP , وأهم هذه الأساسيات هو تأمين المدخل القادم من مستخدم التطبيق حيث أن الحديث في هذا المجال يطول وذلك بسبب خطورة أي مدخل من قبل المستخدم, ولكن أهم ما تطرقت إليه هو عملية التحقق من صحة المدخل , مثل نوعية المدخل, لأن بعض المخترقين يتعمدون إدخال قيمة خاطئة من أجل تعطيل التطبيق أو من أجل إدراج قيمة خاطئة في قاعدة البيانات أو لحذف شيء منها , وقد ذكرتُ بعضا من الأمثلة التي تعمل على التحقق والتأكد من المدخل , وأيضا من الأمور التي تحقق تأمين المدخل الحماية من الثغرات التي يكون سببها أخطاء برمجية في برامج معينة مثل خادم الموقع ,فيأتي من يستغل هذه الثغرات ويكسر حماية الموقع أثناء الإدخال , ومن هذه الثغرات التي تحدثت عنها حقن SQL, البرمجة المتقاطعة للموقع و ثغرة استدعاء الملفات ,وتم ذكر الحلول المقابلة لمواجهة interface كل نوع من هذه الثغرات , والأمر الثاني هو رسائل الخطأ التي تظهر للمستخدم متى ما كان هناك خطأ ما وقت التشغيل , فذكرت أهمية إخفائها عن المستخدم وطريقة إخفائها, لأنها قد تكشف شيئا من خصوصية التطبيق,وفي المقابل كيفية تخزين هذه الأخطاء في ملف آمن بعيدا عن المستخدم من أجل الرجوع لها من قبل صاحب التطبيق لإيجاد حلول مناسبة لها.




المقدمة

لغة php تعتبر واحدة من أهم وأشهر لغات البرمجة لتطبيقات الويب من مواقع الكترونية وغيره, وكذلك من المعروف بأن هذه اللغة سهلة التعلم , فمن خلال الدروس المعروضة على الشبكة العنكبوتية بإمكان أي شخص لديه خلفية حتى وإن كانت بسيطة من إنشاء موقع وبرمجته بهذه اللغة , ولكن للأسف بالرغم من سهولتها إلا أن كثيراً من الأشخاص ولاسيما المبتدئين منهم تجاهلوا أمر كيفية الحماية أثناء البرمجة من المخترقين ونحوه ممن يستغل الثغرات الموجودة في التطبيق , فهذه اللغة معرضة لكثير من المخاطر التي تكسر حمايتها ومازالت هذه المخاطر في ازدياد مع استمرار الوقت , لذلك وُجدت أساسيات ومبادئ من أجل برمجة آمنة بإذن الله ,فمن هذا المنطلق وضعت هذه المقالة من أجل بيان أساسيات البرمجة الآمنة لهذه اللغة ,وإن كان المجال في هذا واسعا ولكن سأتطرق لأهم الأمور التي ينبغي مراعاتها لكل من لديه أو سينشئ مشروعا تطبيقيا بلغة php.




الكلمات المفتاحية

الثغرات , الاستعلام ,المهاجم , استدعاء الملفات , رسائل الخطأ.




1. تأمين المدخل في لغة php والتحكم به



1.1 التحقق من صحة المدخل
التحقق من تلك المدخلات خطوة ضرورية للحماية من المهاجمين وذلك من خلال التأكد من أن أي مستخدم يستطيع أن يدخل بياناته وفقا للنوع المحدد من قبل صاحب التطبيق فقط , ولا يسمح له بإدخال أي نوع آخر قد يشكل خطرا على التطبيق , حيث أن أشهر أنواع المهاجمين من يستغلون التطبيقات التي تخلو من عمليات التحقق ,فيتعمدون بإدخال بيانات خاطئة مثل : نوع خاطئ , حجم غير صحيح , بيانات تحتوي على رموز خاصة مثل(escape أو بيانات بالصيغة الثنائية, مع العلم بأن إدخال البيانات بشكلٍ خاطئ قد يؤدي إلى تعطل التطبيق , كتابة بيانات غير صحيحة في قاعدة البيانات أو حذف بيانات منها , وسيكون المعنى أكثر وضوحا بذكر بعض الأمثلة الشائعة:
مثال-1- : لو كان أحد المدخلات لتطبيق ما هو إدخال تاريخ الميلاد , فلابد أن نتحقق من أن اليوم يأخذ القيمة الرقمية (1-30) , والشهر كذلك رقما مابين (1-12) , والسنة لابد أن تكون من أربع خانات وهكذا ,انظر صورة (1) , وفي حالة المخالفة لذلك يتم عرض رسالة خطأ مناسبة للمستخدم.انظر صورة(2). [3],[4]


صورة (1): مثال يوضح كيفية تأمين المدخل عن طريق التحقق من نوع البيانات المدخلة.


صورة (2): رسالة خطأ للمستخدم عند مخالفة المطلوب أثناء الإدخال

مثال -2- : في حالة أن التطبيق كان به محركاً للبحث ,وأراد المستخدم البحث عن كلمة معينة , أو عند تسجيل الدخول , وأدخل المستخدم كلمة البحث لكنه وضع مسافة من لوحة المفاتيح , سيؤدي ذلك إلى عرض جميع محتويات المكان الذي يبحث فيه , وبالتالي سيشكل هذا ضغطا على خادم التطبيق ومن ثم قد يؤدي إلى تعطله , فالحل هو عن طريق عملية التحقق من أن المدخل لا يحتوي على مسافات (فراغات) وذلك باستخدام الدالة trim() , انظر صورة(3). [10]


صورة (3): مثال للتحقق من عدم وجود فراغات أثناء الإدخال.



1.2 الحماية من الثغرات أثناء عملية الإدخال
"الثغرات هي أخطاء برمجية في برامج معينة مثل خادم الموقع وأي برامج أخرى ، لأنها من صنع البشر لذا
يجب أن تحتوي على أخطاء أو ( ثغرات) وهناك أنواع أخرى عبارة عن برامج مصممة ومكتوبة بلغات معينة
لاستغلال ثغرة معينة." [7]


1.2.1 الحماية من ثغرة البرمجة المتقاطعة للموقع
البرمجة المتقاطعة للموقع (Cross Site Scripting) ,اختصارها ((XSS, وفي بعض الأحيان يرمز لها بالرمزCSS) ) ,هذا النوع من الهجوم من أكثر الهجوم انتشارا في عالم الاختراق حيث يشكل بنسبة 25% من الهجوم, وهدفه هو السكريبت scriptات ("مجموعة من الأوامر البرمجية ينتج عنها نظام إدارة متكامل حسب نوع الموقع والتوجه المطلوب&quot [11] المنفذة من جهة المستخدم, فهو يستغل البرمجة الغير آمنه ,وذلك بإرسال محتوى غير مرغوب فيه لمستخدم الموقع أو إلى المستخدم النهائي ومن ثم جمع معلومات عن الضحية , ويكون ذلك عن طريق استخدام أداة تعين ذلك المهاجم على ذلك مثل: السكريبت scriptات المستخدمة خلال النماذج من جهة المستخدم (java script- Html –flash –Active X) وغيرها من الأدوات التي تضاف على التطبيق من أجل تصميم الواجهات وإضافة مزيد من الدينامكية للموقع, فيقوم المهاجم بحقن أو إضافة أمر html)) إلى أحد السكريبت scriptات السابقة إذا كانت مصابة ,أي بها أخطاء برمجية من الناحية الأمنية ,ومن ثم يحصل الاختراق وسرقة المعلومات للتطبيق , وأحيانا من يشاهده أيضا , وهذه الثغرة منها نوعين:

1- ثغرة داخليه: يتم حقن الأمر داخل التطبيق نفسه مثل إدراج الأمر إلى صندوق الإهدائات للموقع.
2- ثغرة خارجية: يتم حقن الأمر من خارج التطبيق مثل عند إدخال رابط الموقع نفسه.
أما بالنسبة لحل هذا النوع من الهجوم ,فهناك عدة حلول منها:

1- متى ما اكتشف المبرمج وجود هذه النوعية من الثغرات في أوامر تطبيقه فإنه يقوم مباشرة بالتعديل,وذلك بمنع أوامر (HTML) من التنفيذ , باستخدام الوظيفة (Remove XSS()) , حيث تقوم هذه الوظيفة بعمل فلتره , أي حذف كل ثغرة من نوع ((XSS من أوامر التطبيق , ويتم وضع هذه الوظيفة في ملف من نوع ((PHP وتسميته بـ (XSS.PHP) ,ويقوم صاحب التطبيق بوضع هذا الملف في المجلد الذي يحوي ملف السكريبت script المصاب , ثم وضع أمر واحد في أعلى الملف المصاب, وظيفته استدعاء الملف السابق وهو ( (include (xss.php); . [9],[10],[12]

2- كذلك من الحلول عمل فلتره وتصفية بالتحقق من صحة المدخل والبيانات التي تأتي من قبل المستخدم كما ذكرت في بداية هذا المقال.


3- استخدام وظائف خارجية مثل: (htmlentities(), strip_tags(),utf8_decode() ) والتي تعتبر فعالة وناجحة ,وتتميز بالسرعة وقلة الأخطاء التي تستغل ضد التطبيق , انظر صورة(4). [1]



صورة (4): أحد حلول التخلص من ثغرات XSS الفعالة.

1.2.2 الحماية من حقن SQL
هذا النوع من الثغرات أشد خطورة من ثغرات ((XSS ,ويسمى بحق الــ(SQL) , وسبب التسمية هو أنه يعتمد المهاجم على عملية حقن استفسار داخل الاستفسار الأساسي المطلوب ,بالتالي يتغير مجرى ذلك الاستفسار الأساسي ومن ثم يتم الإطلاع على معلومات وبيانات سريه وخاصة ليس له الحق بالإطلاع عليها مثل الرقم السري لصاحب التطبيق, أما بالنسبة لكيفية الحماية من هذا النوع من الهجوم فهناك بعضا من الحلول:
1- عملية تصفية للبيانات المدخلة من خلال الاستعلام , وذلك باستخدام الوظيفة ( filter_sql() ), انظر صورة(5).[9]


صورة (5): تصفية البيانات المدخلة لقاعدة البيانات باستخدام الوظيفة filter_sql().


2- في بعض الأحيان تكون البيانات المدخلة صحيحة لكنها تتضارب وتتعارض مع تنسيق جمل الاستعلام نفسها,فهذه مشكلة , ففي هذه الحالة من الأفضل استخدام الوظيفة mysql_escape_string() ) ) عند الاتصال بالخادم , انظر صورة(6).[3]


صورة (6): حل مشكلة التضارب مع تنسيق جمل الاستعلام بالرغم من أن البيانات المدخلة صحيحة


1.2.3 الحماية من ثغرات استدعاء الملفات
هذا النوع من الثغرات أخطر من XSS) ) ,وفي بعض الأحيان يكون أخطر من ثغرات SQL)) ,وذلك لأن خطرها ليس على المستخدم إنما على خادم التطبيق , ويكون ذلك الخطر عن طريق تغيير مسار أحد الملفات الأساسية المستدعاة إلى مسار ملفات خبيثة بأحد الدوال المشهورة مثل include)() ), انظر صورة (7), ومن ثم يكون للمخترق تحكماً شبه كامل بالتطبيق ,وأحيانا إذا كان ذلك المخترق من المحترفين فإنه يسيطر على الخادم بشكل كلي. [8]

هناك نوعان من استدعاء الملفات وهي:
1- تسمح باستدعاء ملفات من خارج الخادم.
2- تسمح باستدعاء ملفات من داخل الخادم كأن تكون محفوظة على شكل صورة.
الحل بكل بساطة هو القيام بإغلاق السجلات العامة الموجود في ملف ((php.ini ,انظر صورة(8) , لكن للأسف بما أن كثير من أصحاب التطبيقات قد اعتمدوا على الاستضافة HOTING المشتركة لتطبيقاتهم , لذلك لا يستطيعون التحكم بإغلاق تلك السجلات , فالحل هو أخذ إذن من المضيف بإعطاء القدرة على استخدام ملف htaccess)) ,ومن ثم وضع عملية الإغلاق داخل هذا الملف.[5]



صورة (7): الدوال المشهورة لاستدعاء الملفات والتي قد تشكل خطرا على أمن الموقع إذا استخدمت بشكل خاطئ.



صورة (8): إغلاق register_globals من أجل الحماية من ثغرات استدعاء الملفات.


2. إخفاء رسائل الخطأ

المقصود برسائل الخطأ , هي التي تظهر للمستخدم عندما يكون هناك خطأ ما وقت التشغيل , مثل : استخدام غير صحيح لوظيفة معينة , أو خطأ إملائي لأحد المتغيرات وغيرها من الأخطاء , انظر صورة (9) , فرسائل الخطأ من الأمور المهمة, فهي تخبرنا ما هو الخطأ وأين يوجد هذا الخطأ ,,لكن هذه الرسائل قد تكون سببا لمعرفة المستخدمين وخاصة المهاجمين منهم لمعلومات مهمة عن النظام وبالتالي استغلال نقاط ضعف هذا التطبيق, مثلٍ:عرض اسم ومسار ملف السكريبت script الذي به الخطأ, اسم الوظيفة التي كان بها الخطأ و رقم السطر الذي احتوى الخطأ ,فيتعمد المهاجم للوقوع في الأخطاء من أجل الحصول على تلك المعلومات التي تفيده في كسر حماية هذا التطبيق , فلذلك لابد من إخفاء كل رسائل الخطأ عن المستخدمين للتطبيق , ويكون ذلك الإخفاء عن طريق إيقاف التوجيهات الخاصة بعرض الأخطاء التي تحدث وقت التشغيل فقط, انظر صورة (10)
لكن في المقابل عند حصول أي خطأ , فالمبرمج أو صاحب التطبيق مازال بحاجة إلى معرفة هذا الخطأ لمعالجته وحله , فلذلك لابد من التأكد من تسجيل كل الأخطاء في ملفات محمية , وهذا يتم عن طريق استخدام موجهات معينه لتسجيل الأخطاء بشكل دائم ,انظر صورة(11).
يوجد أربعة موجهات مسئولة عن التحكم بعمليه عرض الأخطاء وتسجيلها, ينبغي إعدادها بالشكل المطلوب, انظر جدول(1). [2],[3],[6]


صورة (9): مثال لرسالة خطأ تظهر للمستخدم وقت التشغيل


صورة (10): إيقاف عرض الأخطاء عن المستخدم وقت التشغيل


صورة (11): تمكين تسجيل الأخطاء في ملفات محمية باستمرار.


جدول (1): الموجهات المسئولة عن عرض الأخطاء وتسجيلها ,وتوضيح قيمها المطلوبة.





الخلاصة

في هذا المقال تحدثت عن بعض الأساسيات والأمور المهمة التي يجب مراعاتها أثناء برمجة أي تطبيق بلغة php من أجل الحصول على بيئة آمنه من المخترقين وغيرهم ممن ليس لهم الصلاحية للوصول لبعض البيانات والمعلومات الخاصة بالتطبيق ,ومن أهم هذه الأساسيات حماية وتأمين المدخل الذي يكون من قبل مستخدمي التطبيق ,وكذلك ما يخص رسائل الخطأ وأثرها على كشف شيء من خصوصية التطبيق , وأحب أن أنوه أنه في حالة افتراض صاحب التطبيق بأن تطبيقه لن يواجه أي نوع من الهجوم أو المخترقين أو المشاكل , ومن ثم واجه أي نوع منها فإن ذلك سيكلفه الكثير والكثير, ومن جهة أخرى متى ما اهتم صاحب التطبيق بحماية تطبيقه وأخذ الاستعدادات اللازمة أثناء البرمجة وبعدها لمواجهة interface أي نوع من الهجوم فإن ذلك سيجعل التطبيق أكثر أمانا.



السلام وعليكم ورحمة الله وبركاتة
أخوكم في الله
جريح الشوق













©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى©