• php
  • 2167
  • 20/3/2008
  • السلام عليكم ورحمة الله وبركاته نبذة عن المشكلة
    مشكلة register_globals حدثت بعد طرح الاصدار PHP v.4.2.1، حيث تم جعل القيمة الافتراضية لـ register_globals تساوي off، مما أدى الى توقف الكثير والكثير من السكريبتات المطروحة قبل هذا الوقت والتي كانت تعتمد في عملها على الوضعية on لـ register_globals. ولكن لماذا تم تغيير القيمة الافتراضية لهذه الخاصية؟
    مما هو معروف لأي مبرمج متمرس ان هذا التغيير هو اكبر تغيير حدث في لغة PHP منذ انشائها، وهو لم يكن وليد الصدفة ولكن القرار كان صعب بالنسبة لمجتمع PHP لأن المشكلة هنا تتعلق بأمن البرمجة.
    نعم المشكلة تتعلق بالأمن، لأن ترك الخاصية register_globals في الوضع on هو بمثابة ثغرة امنية خطيرة جداً، تؤدي الى وصول اي متصفح للسكريبت الى بيانات غير مصرح له برؤيتها.
    وإليك هذا المثال لتوضيح خطر تشغيل الخاصية:
    <?php
    // هنا يتم من ان المستخدم أدمن واذا تم التحقق بنجاح يتم اعطاء المتغير $admin القيمة true
    if (login_correct()) {
    $admin = true;
    } // ولكن يمكن تخطي هذا بكل بساطة في حالة ترك الخاصية مشغلة// حيث يمكن تمرير المتغير $admin في رابط الصفحة هكذا index.php?admin=1
    if ($admin) {
    include "admin/index.php";
    }
    ?>
    في الكود السابق، عند تشغيل الخاصية، يمكن تخطي دالة التحقق من الأدمن بسهولة عن طريق تمرير قيمة المتغير $admin في رابط الصفحة.
    اما عند ايقاف الخاصية، فلا يمكن تمريرها لان المتغير الممرر في الرابط ستكون الاشارة اليه بالاسم $_GET['admin'] بدلا من $admin. كيف تتصرف حيال السكريبتات القديمة التي لا تعمل؟
    1- تحديث السكريبت بتركيب اصدار جديد او تحديث الاكواد يدوياً
    وهو الحل الأمثل والأفضل، حيث يتوافر لديك خيارين:
    - تحميل نسخة جديدة من السكريبت تدعم الوضعية الجديدة للخاصية register_globals.
    - تحديث الأكواد يدوياً، ويتم ذلك باتباع المنهج التالي:
    - الاشارة الى المتغيرات المرسلة بـ GET و POST بالاسم المفصل كـ $_GET['variable'] و $_POST['variable'] بدلا من $variable.
    - الاشارة الى متغيرات السيشن بالطريقة $_SESSION['variable'] بدلا من $variable.
    - الاشارة الى متغيرات الكوكيز بالطريقة $_COOKIE['variable'] بدلا من $variable.
    2- استخراج المتغيرات من المصفوفات $_GET ، $_POST ، $_SESSION و $_COOKIE
    يمكنك تعديل الملف الذي لا يعمل عن طريق اضافة الكود التالي الى بداية الملف:
    extract($_POST);
    extract($_GET);
    extract($_SESSION);
    extract($_COOKIE);
    - تشغيل الخاصية register_globals عن طريق ملف htacces
    بالرغم من خطورة هذه الطريقة لما يترتب عليها من ثغرات في السكريبت، إلا أنها تبقى طريقة ناجحة وفعالة لتشغيل السكريبت على مسئوليتك الخاصة.
    تقوم في هذه الطريقة برفع ملف htacces. يحتوي على الكود التالي:
    php_flag register_globals on
    بعد رفع الملف الى مجلد السكريت، يفترض ان يعمل السكريبت بشكل سليم.
    كن أول من يقيم الموضوع
    12345