بسم الله الرحمن الرحيم ..

اليوم راح نتكلم ان شاء الله عـــن طرق ( تعـريف المتغيرات و اشهارها و اعطاء قيم افتراضيه ) ..
فـ المتغير ان لم يكن مشهر أو معرف بقيمة قبل استعماله سوف يحدث مشاكل امنية كثيره ..
هذه المشاكل تساعد المخترق في عملية التخريب و الاختراق .. ولا احد يستطيع استغلال هذه الاخطاء غير مبرمجين الـ PHP تقريبا ..
واكثر من يقوم بتجاهل هذه النقطه هم الـ هواه ( مثلي و مثل غيري ) الذين درسو اساسات الـ PHP و هواه البرمجة وليس الاساتذة لاكـــن لا اقول ان الاساتذة لا يقعون في شرك هذه الاخطاء ( الكل يخطأ ) ..
لاكن نقول عن النســبة الاكثر .

نبدأ ...

هنــاك ما يعرف بـ الـ Register Globals .. وهذه خاصية بملف الـ php.ini و الـ PHP حيث تعمل على حقن البرنامج بجميع الـ متغيرات من الـ HTML Forms & HTTP Request إذا كانت مفعلة ..
فـ هية خطيره احيانا .. و مفيدا احيانا كثيرة .. فهية تسهل عمل البرنامج و تعطيه مرونه أكثر بالتعامل مع المتغيرات ..


مثلاً

// Globals = ON

PHP:
  1. if(isset($athu)){
  2.     include('athu.php');
  3. }

فـ هنا إذا تحقق الـشرط يعمل البرنامج .. لاكن لن يتحقق الا بتعريف المتغير ..

http://127.0.0.1/file.php?

في هذه الوصلة لن يعمل البرنامج .. اما بحالة الـ Register Globals = ON .. نقوم بالتالي ..

http://127.0.0.1/file.php?athu=1

وهنا يتم حدوث الشرط .. و يعمل البرنامج بشكل جيد ..

مـن ايــن يـاتي الخـطر .. ؟

الخطر ياتي من كل النواحي .. يجب تعلم الاساسيات و التعلم بالطريقة الصحيحه .. لهذا ليس كل من يتقن اللغة يجيد البرمجة ..
اما عن الخطر البرمجي .. انظر إلى الكود التالي :-

..
..
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");
}
..
..

هنا يوجد عدة شروط .. لاحظ ..

http://127.0.0.1/file.php?id=1

هنا حسب الكود يتم استدعاء الملف ( 1.php ) .. لاكن المشكله ان تم الوصول للملف على الشكل التالي ..

http://127.0.0.1/file.php?id=-99&var1=1&var2=1&page=SHELL

عند اذن سوف تتحقق جميع الشروط .. و يتم استدعاء الـ PHP Shell .. و هذا خطر طبعاً ..

اما طريقة الحماية هي في تفريغ أو تعريف الـ متغيرات .. لاحظ الكود التالي ..

$var1 = "";
$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 أو بطرق آخرى ..
انظر إلى المثال التالي :-

$Query .= "SELECT FROM Users";
mysql_query($Query) or die(mysql_error());

لاحظ المتغير $Query و طريقة اعطاء القيمه له .. لاكن مع الـ Register Globals ON و المتغير غير مفرغ أو بدون قيمة قبل استدعائه بهذه الطريقة يكون خطر جدا ..
فـ من خلال الـ HTTP Request .. من الممكن التلاعب بالمتغير ..

http://127.0.0.1/file.php?Query=SQL/*

وتصبح قيمة المتغير كلتالي :-

SQL/*SELECT FROM Users

وهذا خطر جدا .. من الممكن الاستغلال بـ SQL Injection أو File Inclusion أو حتا Command Exec & XSS ..

و الطريقة الصحيحه لكتابة الكود هي :-

$Query = "SELECT FROM Users";
mysql_query($Query) or die(mysql_error());

او

$Query = "";
$Query .= "SELECT FROM Users";
mysql_query($Query) or die(mysql_error());


واعتذر للجميع إذا كانت مواضيعي قصيرة .. لاكن اعتقد انها مفيده و ان شاء الله يكون في الاحسن من هذا ..