السلام عليكم
يستخدم كل مبرمج دالته او كلاس كتبها بنفسه او نقلها من موقع لحماية المدخلات والتخلص من ثغرات ال xss وال sql injection
قد تكون قصيرة او طويلة
قد تستخدم دالة من دوال ال php او تكون مستخدمة للكثير من عمليات الاستبدال str_replace
لا يهم مادمت مقتنع بأنها تحمي مدخلاتك فاستخدمها
ولكن المهم هو متي تستخدمها ؟
للاسف الكثير من المبرمجين يمررون كل شئ علي دالة الحماية التي تكون في الغالب دالة ثقيلة للغاية
هذا غير انها وبنسبة 99% تنشئ متغيرات جديدة بداخلها تحمل نفس المحتوي ولكن محمي مما يضاعف المحتوي داخل الذاكرة فلو مررت لها 30 متغير وكانت تنشئ نسخة اخري من كل متغير فأصبح في الذاكرة لديك ال 30 متغير وقيمها مرتين
كل متغير يحجز حيزه الكامل من الذاكرة وليس علي حجم البيانات بداخله فقط
فلما عزيزي المبرمج ؟
لما تستخدم دالة الحماية وتمرر لها حقل ادخال بريد الكتروني مع ان دالة ereg للتحقق من ان المدخل بريد هي كافية لحمايته فهي لا تقبل الرموز الخاصة
لما تستخدم دالة الحماية لتمرر لها الباسورد في حين انك في الحقيقة لا تعرض الباسورد علي المتصفح لأي زائر ليستغل ك xss كما انك لا تدخله قاعدة البيانات ليستخدم ك sql injection ولكنك تشفره ب md5 وهي لا ينتج عنها اية ثغرات !!
لما تمرر كل مدخلات ال action لدالة الحماية في حين انك تستخدم دالة if لترسل كل اكشن لدالة معينة او تستخدم switch - case
فهذه لا تحوي ثغرات ولا تحتاج لتمرير $_GET['action'] لدالة حماية
كود PHP:
switch($_GET['action'])
{
case '1':
action1();
break;
case '2':
action2();
break;
default;
echo 'error';
exit;
}
بالطبع هذا لمن يستخدمها ولا يستخدم كنترولر
لو كانت المدخلات تعرفها كلها يمكنك فقط ان تستبعد اي شئ غيرها هكذا
كود PHP:
if(!in_array($input, array('1', '2', '5'))) {
die('error');
}
أيضا لما تمرر مدخل ان واثق انه يجب ان يكون رقم علي دالة الحماية ولا تستخدم فقط intval()
اعتقد انك تشتت
سأخبرك متي تستخدم دالة الحماية مع المدخل ومتي لا تستخدمها ولكن انتبه فالمدخلات من الكوكيز والجلسات ايضا يجب ان تحميها
تمرر المدخل علي دالة الحماية فقط لو تحقق فيه الشرطين التاليين
1- مدخل لا تستطيع ان تتوقع محتواه
2- ستعرضه علي المتصفح للزوار او ستدخله قاعدة البيانات سواء للتخزين او للكشف عن حقول
فتعالوا لننظر مثلاً في صفحة تسجيل
معرف العضو : لا يمكنك توقع ما سيكتبه العضو كما انك ستدخله لقاعدة البيانات وبالتالي مرره لدالة الحماية ( لكن ممكن ايضا ان تستبعد فقط الرموز الخاصة او تحدد شروط للمعرف )
الباسورد : لن تعرضها علي المتصفح ولن تدخلها قاعدة البيانات ولكنك ستستخدم md5 في المقارنة والإدخال لقاعدة البيانات وبالتالي سقط الشرط الثاني فلا تمررها لدالة الحماية
الكابتشا : لن تعرضها علي المتصفح ولن تدخلها قاعدة البيانات ولكنك فقط تستخدمها في المطابقة
كود PHP:
if($captcha = '1534')
{
//
}
else
{
//
}
حتي لو حمل المتغير $captcha ثغرات مدخله من الزائر فهي لن تضر علي الأطلاق
حقل البريد الالكتروني : ستقوم بالتحقق منه ب ereg وبالتالي لا داعي لإدخاله لدالة الحماية فأنت تتنبأ بشكل المدخل وتستبعد كل ما خلافه وبالتالي سقط الشرط الأول
لو كان هناك قائمة منسدلة وتعرف ما يجب ان يختاره الزائر فقط استخدم طريقة !in_array لتستبعد كل ما لا تريده
مثال اخر وهو صفحة اضافة موضوع
حقل عنوان الموضوع يتحقق فيه الشرطين فمرره لدالة الحماية
حقل نص الموضوع يتحقق فيه الشرطين فمرره لدالة الحماية
لو كان هناك حقل ابتسامات فطبق عليه !in_array وضع في المصفوفة كل رموز الإبتسامات التي لديك
لو كان لديك حقل مثلا ( هل الموضوع مثبت ) يقبل 0 او 1 فتحقق منه ب intval او بشرط
مميزات الطريقة
- جعل برمجيتك أخف وأقل استهلاك للموارد
عيوبها
- تحتاج لتركيز عالي واي خطأ سيسقطك في ثغرة ولكن مع كثرة التعامل ستتعود
لا تنسي ان دالة mysql_real_escape_string كافية لحماية اي مدخل لقاعدة البيانات من sql injection
ولكن حينما تجلب المحتوي من قاعدة البيانات وتود عرضه للزائر يجب ان تحميه بتحويل الرموز الخاصة مثل < و >
ثم تضيف / قبل ' و "
وبدلاً من عمل ذلك في كل مرة تجلب المحتوي طبقها مرة واحدة قبل ادخال المحتوي لقاعدة البيانات وينتهي الأمر فتجلب وتعرض مباشرة
ولن تحتاج لاستخدام mysql_real_escape_string
ولكن استخدمها في الأماكن التي لن تحفظ فيها المحتوي داخل القاعدة ولكن تريد ان تري هل هناك محتوي بهذا الأسم ام لا