هذا الموضوع يهم مبرمجي php بالدرجة الأولى وهي كيف تستطيع
كتابة كود آمن بإذن الله تعالى ..
هذا المقال مخصص للمبرمج المتوسط إلى الخبير في لغة php.
في هذه الحلقة سأتطرق إلى ثغرتين هما ثغرة المتغيرات وإدارج
الملفات وهي ما سمح بهما الوقت والجهد .. نرجو منكم الدعاء .. ومن
لديه سؤال أو تعليق فانا في الخدمة ..
في الحلقة الثانية سأتطرق إلى ثغرة خطيرة دائما مايستخدمها
المخترقون وهي ثغرة SQL Injection.
سأقوم بطرح الحلقة الثانية بمشيئة الله تعالى في حال وجدت اهتمام
أو أحد ينتفع بالموضوع . اما في حال العكس فسأقوم بطرح دروس
أخرى للمبتدئين بمشيئته تعالى .
=============
ثغرة المتغيرات
=============
من الاخطاء الشائعة لدى بعض مبرمجي php هي ثغرة المتغيرات .
الثغرة: تحدث هذه الثغرة عندما تضع
شرط معين وعند تحقق الشرط فأنك تغير قيمة متغير ما (flag) . قضية
الشرط هي لتقريب الموضوع ولكن يمكن أن تحدث على نطاق أوسع
وفي استخدامات متعددة لا يمكن حصرها.
المشكلة: من الممكن تمرير قيمة
المتغير(flag) عبر شريط العنوان url.
الحل: الانتباه أنه يمكن تمرير قيمة
عبر شريط العناوين url وطبعا حلها يكون حسب الحالة في حالة الشرط
على سبيل المثال بإضافة else إلى الشرط لتأكيد أن قيمة المتغير
(flag) هي الحالة المعاكسة "الحالة الخطأ".
مثال :
كود PHP:
<?
if(login_function($user, $pass)) //دالة للتأكد من صحة اسم المستخدم وكلمة المرور
{
$loggedin = 1; // flag var
}
if($loggedin == 1)
{
include("admin.php");
}
?>
هذا الكود يحتوي على ثغرة كما نلاحظ تمكن في أن المخترق يستطيع
تمرير القيمة التالية عبر المتصفح . نفرض أن اسم الملف code.php
http://www.yourname.com/code.php?loggedin=1
عندما يمرر المخترق هذا السطر عبر العنوان يستطيع الدخول بالرغم من
أنه لم يدخل اسم المستخدم وكلمة المرور .
الحل : أما أن نطق مانريد تطبيقه مباشرة داخل الشرط دون استخدام
flag أما إذا تعذر ذلك فباستخدام else .
مثال على الحل :
كود PHP:
<?
if(login_function($user, $pass))
$loggedin = 1;
else
$loggedin = 0;
if($loggedin == 1)
{
include("admin.php");
?>
=============
ثغرة إدراج الملفات "include files"
=============
ليست من الثغرات الشائعة لكن قد تحدث أحيانا .ولكن مشكلتها أنها
من الثغرات القاتلة والخطيرة لأنها تمكن المخترق من الوصول إلى أي
مجلد أو ملف في الموقع.
المشكلة استقبال صفحة عن طريق
متغير من شريط العناوين ثم استخدام الدالة include() وارسال متغير
اسم الصفحة .
كيف يستطيع المخترق استغلالها: عن طريق تمرير القيمة
index.php?page=../../../../../../../etc/passwd
يستطيع الوصول إلى كلمات مرور الموقع !!
وحتى لو افترضنا عدم استطاعته الوصول إلى مجلد كلمات المرور لانها
محمية فانه يستطيع تحميل أي ملف إلى السيرفر وبهذه الطريقة يملك
تحكم كامل على موقعك .لانه يستطيع تشغيل أي ملف يريده !
الحل إذا أردت استخدام تمرير
الصفحات المراد إدارجها كمتغيرات ينبغي عليك التأكد من امتدادتها
ودقة روابطها حتى لا ينتقل إلى الأعلى دعنا ننظر إلى مثال للتوضيح .
مثال :
الكود المشكلة :
كود PHP:
<?
//header stuff
$page = $_GET['page'];
include($page);
//footer stuff
?>
الكود بعد التعديل:
كود PHP:
<?
//header stuff
$page = $_GET['page'];
if(eregi("[a-z0-9\-_\.]+", $page, $regs)) //make sure $page is alphanumeric
{
$dir = "includes/"; //not strictly necessary, can be blank.
$ext = ".php"; //.php, .html, .txt, whatever
if(file_exists($dir . $page . $ext))
{
include($dir . $page . $ext); //or readfile if not expecting php code
}
else
echo '404 - Not Found'; //or something similar
}
else
echo 'عفواً .. أنت تقوم بعمل غير مشروع لقد تم تسجيل رقم الاي بي الخاص بك ';
//footer stuff
?>
كذلك من الأفضل إذا كان الملف المراد إدراجه ملف نصي استخدام
الدالة readfile() وليس include() أو require() .
كذلك من الأخطاء الشائعة أن بعض المبرمجين يقوم بإنهاء الملفات
الادراج بالامتداد inc هذا يجعلها قابلة للقراءة لو طلبت مباشرة من
المتصفح مما يجعل المعلومات المحتواه داخلها عرضة لعدم الأمان
بعكس من لو انهينا الملف بالامتداد php هذا يجعلها لا تظهر لو طلبت
من المتصفح مباشرة .