ســـلســـة الأمـــــــان (2)

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

ونتابع السلسلة ..

مقالنا اليوم حول ( XSS Scripting ) و التحقق من جميع المتغيرات بشتى الطرق .. وسنبدأ بال XSS

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

الثغرة بحد ذاتها .. تكون مغلقة في اغلب السيرفرات التي تشدد على الاجراءات الامنية ، نظرا لأن اللغات البرمجية ( وهنا نتحدث عن ال PHP بشكل خاص ) يكون لديها وظيفة داخلية تقوم بإضافة باك سلاش ( \ ) بشكل تلقائي لأي محاولات مثل هذه ..

بداية ، لو احببت تجربة الثغرة فعليا .. فقم بانشاء ملف وضع فيه التالي :

كود PHP:
<?php
echo $_GET[’any’];
ثم اذهب إلى ملف php.ini ثم ضع قيمة magic_quotes_gpc = Off حتى تقوم بتعطيل الوظيفة الداخلية للغة PHP باضافة الباك سلاش بشكل تلقائي ..
الآن جرب الدخول إلى الملف بكتابة هذا العنوان :

كود PHP:
file.php?any=<script>alert('anything for test')</script> 
فتلاحظ ان هناك تنبيه ظهر يحمل كلمة anything .. وبهذا تكون الثغرة شغالة معاك !
جرب ان تقوم بارجاع ال magic_quotes_gpc = On وبعدها اغلق اللوكال هوست وافتحه مرة ثانية .. وجرب نفس الحركة ولاحظ الفرق برؤية سورس الصفحة ..

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

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

اين هو هذا الكود ؟ لكي نستطيع ان نرى الخطورة بأنفسنا ؟
اعتذر عن عدم وضعه .. ولكن يمكنك ان تثق بكلامي ^_^

أين الحل ؟
الحل يكمن في عدة خطوات :
1- تأكد من ان الماجيك كوتس = On في ملفات السيرفر .. او بالاخص في ملف php.ini وقم بالتنبيه على المستضيف او الذي لديه تحكم الرووت
2- دوما تأكد من المدخلات التي تقوم باستخدامها بشكل او بآخر في الكود مثل ( الآي دي - الاسماء ( خاصة الاسماء ) - وغيرها ) ويكون ذلك ببساطة باستخدام عدة فنكنشز قامت اللغات البرمجية بتوفيرها .. ونذكر منها الذي يخصنا في PHP
addslashes
htmlspecialchars

3- لا تعتمد على الكوكيز فقط في برنامجك .. خاصة في لوحة التحكم .. اعتمد دوما على الكوكيز + السيشن
4- دوما قم بتخزين الآي بي ادريس ( ip address ) عندك .. وقم بعرضه للمشرف العام ليستطيع التعرف على من قام بزيارة لوحة التحكم آخر مرة
5- لا تحاول الاعتماد على طريقة GET في الفورم ( form ) بشكل كبير .. فقط في حالة احتياجك لها .. فالطريقة POST تمثل طريقا آمن نسبيا .. على الاقل ستضمن ان من سيقوم بالعبث هنا ليس شخص هاوي .. بل هو مبرمج



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

من الاخطاء الشائعة التي يقع بها البعض هو استخدام المتغير العام REQUEST بدلا من GET و POST ، وهنا اوضح نقطة .. عند استخدامك ل POST فانه يقم باستخدام المتغيرات القادمة من الفورم POST فقط .. وعند GET يقوم باستخدام المتغيرات القادمة من الادريس بار ( address bar ) فقط .. ولكن REQUEST يستقبل من الادريس بار + POST .. فلماذا استخدامه ؟ في حين انه يمكنك ان تحدد مكان المتغير الخاص بك بشكل ادق !

متى اتحقق من المتغيرات :
- متغيرات الفورم ( سواء POST او GET )
- عندما يحتوي العنوان بالادريس بار متغير خاص بك لتقوم باستخدامه
- اي متغيرات يقوم الزائر او العضو بادخال محتواها ( اضافة خبر - اضافة موضوع - تصويت - اضافة مقال - اضافة درس - مراسلة - تعديل معلومات .. إلخ )
- الكوكيز ، وهذه يغفل عنها البعض .. وهنا يجب ان تدرك ان الكوكيز تكون على جهاز اليوزر ( على جهاز اليوزر = غير آمنية = قابلة للعبث ) ولذلك يجب ان تقوم بالتحقق منها جيدا ومن محتواها .. وهنا احب ان اذكر هذه النقطة للتذكرة ليس اكثر

بعض الافكار :
- دوما تحقق من ان المتغير عددي ( Integer ) في حالة كان عدد
- دوما تحقق من متغيرات التاريخ انها بنفس النسق الذي تريده .. وهنا هذه تفيدك : preg_match او هذه ereg وبالمناسبة .. الاولى preg_match اسرع !
- لا تعتمد على المعلومات في الادريس بار لطبعها .. مثلا لو لديك اسم العضو في الادريس بار .. وتريد طباعته .. فالطريقة السهلة ان تقوم بطبعه مباشرة ولكن هذا خطر امنيا .. فالافضل ان تقوم بجلب آي دي العضو او اسمه .. ومطابقته من قواعد البيانات ثم جلب البيانات من القاعدة وطبعها ( من قال ان حماية برنامجك امنيا يعتمد على السهولة ! )

بهذا غالبا نكون قد غطينا منطقة كبيرة في حماية برنامجك من خطر العابثين ( الغير محترفين ) ، فعملية التحقق من المتغيرات لا تمثل خطورة مباشرة ولكن تمثل طرق عديدة جدا للعبث ببرنامجك + تؤدي لطرق خطرة !


منقول من مدونة شباب التكنولوجيا - http://www.itboys.ws/archives/32
تحياتي
EgypTechno