بسم الله الرحمن الرحيم
الأمان في البرمجة هو منطقة حرجة جدا وفي نفس الوقت اجدها ممتعة .. فأثناء برمجتك للبرنامج تضع جميع الاحتمالات الممكنة ، ثم تبدأ لتبتكر احتمالات غير ممكنة وتقوم بتأمينها !
ولحبي لهذه النقطة .. احببت ان اضع مثل سلسلة مطولة بعض الاشياء عن الامان في لغة ال php ، وستشمل السلسلة :
1- SQL Injuction
2- XSS Scripting and Variables validation
3- Validation of : forms - cookies - address bar
4- استدعاء الملفات
5- المتغيرات وتعاملها مع ال address bar
6- الاستضافة المشتركة - Shared host
7- حماية السيرفر
8- الـ Debugging
قبل البدأ احببت طرح هذه المقدمة في مجموعة نقاط :
- لا تثق ابدا باي مدخل من الزائر او اي متغير يظهر للزائر في الادريس بار
- لا تقدم حسن النية ، بل دوما تعامل مع الزائر على اساس انه مخرب
- تذكر دوما لو قام احد واستطاع تخريب برنامجك او اختراق الموقع الذي تعمل عليه .. فماذا سيكون موقفك كمبرمج مالي مركزه ؟
وسنبدأ باولى النقاط ( SQL Injuction ) :
حسنا ، حقيقة .. طالما دخلت على مقالات الامان والسيكيورتي .. واول ما اقرأ دوما .. كان ال SQL Injuction ، لا ادري ما ترجمته العربية بالضبط .. ولكن نستطيع القول انه " التعديل على الاستعلام الخاص بك وبالتالي الوصول إلى اي شيء في قاعدة البيانات " .. وبعد من الكثير من التجارب استطعت ان اقوم بالثغرة اخيرا وتجربتها !!
تخيلوا .. انني جلست ايام عديدة احاول .. ان اقوم بعمل بريمج صغيرة يحتوي على تلك الثغرة .. ولم استطع !! ومع ذلك يأتي المخربين في ثواني ليكتشفوا عشرات الثغرات ! الله يعينهم .. فعلا بيتعبوا !
كان البرنامج عبارة عن فورم لتسجيل الدخول وكان الاستعلام المبسط :
وماكان مني إلا ان اضفت الجملة هذه في مكان اليوزر نيم في الفورم :كود PHP:
select id from users where username='$_POST[username]' AND password='$_POST[password]'
وفي مكان الباسوورد ايضا .. ودخل ! بدون اي شيء .. وكنت في قمة سعادتيكود PHP:
OR 1=1 '
لأني باختصار .. كنت اسمع الكثير جدا يحذر من تلك النقطة .. وانا شخصيا لم حتى استطع ان اراها بعيني مرة واحدة .. وكان لي شرف التجربة تلك المرة
ولأني مقتنع بانه لا سبيل لتعلم الوقاية .. بدون تعلم الهجوم .. فقد وضعت المثال هذا .. لمن اراد
+ طرق استعمال الInjuction :
- من خلال الادريس بار: ومن اشهر الامور هنا
* اعادة ترتيب المواد بحسب كذا او كذا او كذا .. ومن المعروف ان هذه العملية تتم دوما في الادريس بار وامام المتصفح + الترتيب تنازليا او تصاعديا
* البحث في الموقع فغالبا يكون البحث عن طريق فورم من نوع GET
* الايديهات .. وان كانت هذه النقطة ضعيفة نسبيا .. ولكن منتشرة جدا جدا .. فلكل قسم لديك مثلا يجب ان تجد الآي دي الخاص به فوق + كل مادة + كل صفحة
* تعدد الصفحات
- من خلال الفورمز :
* ومن اهمها فورمز تسجيل الدخول والبحث ايضا
* التسجيل والاتصال بنا
- من خلال الكوكيز :
* لا تثق ابدا في اي متغير تجلبه من الكوكيز من جهاز العضو مباشرة .. يجب ان تقوم بعملية validation اولا
+ كل هذا جميل .. ولكن .. طرق الوقاية ؟
هناك الكثير .. ممكن يقومون باستخدام عدة فنكشز متتالية .. واحيانا انشاء فنكشن خاصة بهم للقيام بمعالجة النص المراد بشكل شامل ..
ولكن شخصيا ارى ان ال php اتاحت كل هذا لك .. بالنسبة لهذه النقطة فقط طبعا .. وهي التأكد من سلامة المتغير ليكون جزء من استعلام بشكل امن ..
بهذه الفنكشن السحرية تمنع عنك اي وجع دماغ ..كود PHP:
mysql_escape_string($variable) ;
باختصار اريدك فقط ان تفكر مع نفسك لثانيتين عند كتابتك لأي استعلام لقاعدة البيانات .. هل هذا الاستعلام يستخدم متغيرات ؟ هل هي مؤمّنة ؟ ليست مؤمّنة ؟ إذن حان الوقت لاستعمال الفنكشن السحرية .. وانتهى الامر
ملحوظة أخيرة :
لو افترضنا انك بذلت ما بوسعك .. وحدثت سهوة بسيطة .. ومن خلالها استطاع ان يجد ثغرة ما في احدى استعلاماتك .. فلا يمكنه ان يقوم بالاستفادة من هذه الثغرة إلا في حالة واحدة ، وهيمعرفة اسماء الحقول او عددها على الاقل في الجدول الذي يريد الحصول على بيانات منه .. وهذه هو الشرط الوحيد لتنفيذ عبارة ( Join ) التي ستتيح له الاستعلام لجدول آخر غير الذي في الاستعلام ..
وهذه النقطة التي سيتم مناقشتها في النقطة الاخيرة .. الـ Debugging
تحياتي
موضوع في المدونة
http://www.itboys.ws