البرمجة الآمنة في لغة Declare Variables … PHP
الكاتب: ابراهيم بصه | 16 أغسطس 2006
بسم الله الرحمن الرحيم ..
اليوم راح نتكلم ان شاء الله عـــن طرق ( تعـريف المتغيرات و اشهارها و اعطاء قيم افتراضيه ) ..
فـ المتغير ان لم يكن مشهر أو معرف بقيمة قبل استعماله سوف يحدث مشاكل امنية كثيره ..
هذه المشاكل تساعد المخترق في عملية التخريب و الاختراق .. ولا احد يستطيع استغلال هذه الاخطاء غير مبرمجين الـ PHP تقريبا ..
واكثر من يقوم بتجاهل هذه النقطه هم الـ هواه ( مثلي و مثل غيري ) الذين درسو اساسات الـ PHP و هواه البرمجة وليس الاساتذة لاكـــن لا اقول ان الاساتذة لا يقعون في شرك هذه الاخطاء ( الكل يخطأ ) ..
لاكن نقول عن النســبة الاكثر .
نبدأ ...
هنــاك ما يعرف بـ الـ Register Globals .. وهذه خاصية بملف الـ php.ini و الـ PHP حيث تعمل على حقن البرنامج بجميع الـ متغيرات من الـ HTML Forms & HTTP Request إذا كانت مفعلة ..
فـ هية خطيره احيانا .. و مفيدا احيانا كثيرة .. فهية تسهل عمل البرنامج و تعطيه مرونه أكثر بالتعامل مع المتغيرات ..
مثلاً
فـ هنا إذا تحقق الـشرط يعمل البرنامج .. لاكن لن يتحقق الا بتعريف المتغير ..
في هذه الوصلة لن يعمل البرنامج .. اما بحالة الـ Register Globals = ON .. نقوم بالتالي ..
وهنا يتم حدوث الشرط .. و يعمل البرنامج بشكل جيد ..
مـن ايــن يـاتي الخـطر .. ؟
الخطر ياتي من كل النواحي .. يجب تعلم الاساسيات و التعلم بالطريقة الصحيحه .. لهذا ليس كل من يتقن اللغة يجيد البرمجة ..
اما عن الخطر البرمجي .. انظر إلى الكود التالي :-
..
if($_GET['id'] == "1"){
$page = "1";
$var1 = "a";
$var2 = "b";
}elseif($_GET['id'] == "2"){
$page = "2";
$var1 = "a";
$var2 = "b";
}
..
..
if(isset($var1) && !empty($var2) && isset($page)){
include($page".php");
}
..
..
هنا يوجد عدة شروط .. لاحظ ..
هنا حسب الكود يتم استدعاء الملف ( 1.php ) .. لاكن المشكله ان تم الوصول للملف على الشكل التالي ..
عند اذن سوف تتحقق جميع الشروط .. و يتم استدعاء الـ PHP Shell .. و هذا خطر طبعاً ..
اما طريقة الحماية هي في تفريغ أو تعريف الـ متغيرات .. لاحظ الكود التالي ..
$var2 = "";
$page = "1";
..
..
if($_GET['id'] == "1"){
$page = "1";
}elseif($_GET['id'] == "2"){
$page = "2";
}
..
..
if(isset($var1) && !empty($var2) && isset($page)){
include($page".php");
}
..
..
وفي المثال السابق مثل ما بتلاخظو قمنا في تفريغ بعض المتغيرات و اعطاء متغير قيمة .. لكي لا يتم التلاعب بهم لو كانت الـ Globals ON ..
الـسلاسل الحرفية .. و الـ .=
الجميع يعرف طريقة ربط الـسلاسل الحرفية ( Strings ) .. عن طريق الـ .= و هذه طريقة عملية جدا .. لاكن مخاطرها كثيره ..
وهذه المخاطر ايضا تساعدك في التلاعب بقيم المتغير عن طريق الـ Register Globals أو بطرق آخرى ..
انظر إلى المثال التالي :-
mysql_query($Query) or die(mysql_error());
لاحظ المتغير $Query و طريقة اعطاء القيمه له .. لاكن مع الـ Register Globals ON و المتغير غير مفرغ أو بدون قيمة قبل استدعائه بهذه الطريقة يكون خطر جدا ..
فـ من خلال الـ HTTP Request .. من الممكن التلاعب بالمتغير ..
وتصبح قيمة المتغير كلتالي :-
وهذا خطر جدا .. من الممكن الاستغلال بـ SQL Injection أو File Inclusion أو حتا Command Exec & XSS ..
و الطريقة الصحيحه لكتابة الكود هي :-
mysql_query($Query) or die(mysql_error());
او
$Query .= "SELECT FROM Users";
mysql_query($Query) or die(mysql_error());
واعتذر للجميع إذا كانت مواضيعي قصيرة .. لاكن اعتقد انها مفيده و ان شاء الله يكون في الاحسن من هذا ..