المتحولات العامة المسجلة Register Globals

السلام عليكم ورحمة الله وبركاته

لقد قرأت البارحة هذه المقالة التي تتحدث عن بعض الجوانب الأمنية الهامة في لغة PHP ونظراً للفائدة الجمة التي استفدتها بعد قراءة هذه المقالة , وللنواحي الخفية عن أغلب المبرمجين والتي تلقي هذه المقالة الضوء عليها , ارتأيت أن أقوم بترجمة هذه المقالة وصياغتها باللغة العربية , لتصبح في متناول كل المبرمجين العرب , وفي واقع الأمر , فأنا أحب الترجمة كثيراً , وخصوصاً لكوني أعمل في هذا المجال منذ فترة لا بأس بها , وتروقني فكرة ترجمة العلوم على اختلافها للغة العربية , عسى ولعل أن أساهم بشكل أو بآخر في عملية نقل العلوم وتعريبها لنساهم معاً في بناء حضارة عربية جديدة…

على كل الأحوال , لن أطيل عليكم , ولكن تلك هي رؤيتي للموضوع ,وقد رغبت في طرحها, مع خالص تمنياتي لك بالفائدة بعد قراءة هذه المقالة.

المتحولات العامة المسجلة Register Globals:

المحتويات :

·1:ماهي المتحولات العامة المسجلة ؟

·2:مثال.

·3:الاستخدام الأمثل.

·4:للاستزادة

1: ما هي المحولات العامة المسجلة؟

تكمن إحدى مشاكل الأمن في لغة PHP في إعدادات “المتحولات العامة المسجلة register_globals” الموجودة في ملف إعدادات بي اش بي (php.ini).

إن هذا الإعداد ( الذي بدوره يمكن أن يأخذ أحد قيمتين , إما شغال أو غير شغال ) يحدد فيما إذا كان كل من المتحولات التالية (Environment, GET, POST, Cookie, Server) مسجلة على أنها متحولات عامة أم لا . على سبيل المثال في حال كان register_globals شغال , عندها فإن العنوان التالي:

http://www.example.com/test.php?id=3

سيصرح عن المتحول $id على أنه متحول عام global variable ,وذلك بدون كتابة أي رماز برمجي إضافي.

وبشكل مشابه , فإنه سيتم تعريف المتحول التالي ايضاً $DOCUMENT_ROOT على أنه متحول عام,وذلك بسبب كونه جزء من مصفوفة ال $_SERVER‘superglobal’ .

إن هذين المثالين يعتبران مكافئان لعملية وضع الرماز التالي في بداية السكريبت:


تعتبر مثل هذه الميزة بمثابة مخاطرة أمنية عالية في PHP, ويجب أن تتأكد من أن

register_globals is Off

وذلك بالنسبة لكل السكريبتاب ( وهي الحالة الافتراضية في PHP 4.2.0 )

ومن المفضل استخدام المتحولات المعرفة مسبقاً في PHP بدل الاعتماد على كون المتحولات العامة المسجلة مسبقاً register_globalsمفعلة , من المتحولات العامة المعرفة مسبقاً ما يدعى ب superglobal مثل $_REQUEST. وحتى تحصل على المزيد من عوامل الأمان , يفضل أن تقوم بالتحديد أكثر عبر استخدام $_ENV, $_GET, $_POST, $_COOKIE, or $_SERVER بدل استخدام المتحولات الفائقة العمومية $_REQUEST.

أي , باختصار , خلاصة الكلام السابق هي التالية:

عندما تمرر متحول عبر العنوان كما يلي

http://www.example.com/test.php?id=3

لا تشرع باستخدام المتحول $id وتفترض وجوده قبل قيامك بالخطوة ا لتالية:

2: مثال:

لنفترض بأن لدينا الرماز التالي لدى الجهة المستقبلة للفورم .

وقد أدخل المستخدم للتو كلمة مرور غير صحيحة, حيث سيقوم متحول المصفوفة $_POST بمعالجة المسألة .

يقوم الرماز بما يلي : يختبر فيما إذا كانت كلمة المرور سليمة ( لنفترض بأن كلمة المرور السليمة تساوي “12345” ) , عندها فإنه سيتم اسناد القيمة المنطقية TRUE للمتحول $admin .

وبفرض بأن المنطق الذي يعمل به الموقع هو التالي:

في كان للمتحول $admin القيمة TRUE , فذلك يعني بأن المستخدم مخول للتمتع بكافة صلاحيات المدير.

الرماز هو التالي:

إن المتحولات العامة المسجلة register_globals لا تمييز بين كل من المتحوليين $_POST و $_GET.

وبالتالي , فإن فإنه بامكان المستخدم باستخدام بعض الحيل البسيطة القيام بالدخول للموقع والتمتع بصلاحيات مدير النظام على الرغم من عدم تمتعه بمثل هذه الصلاحيات . مثل هذه الحيلة يمكن تحقيقها ببساطة عبر إضافة الرماز التالي إلى العنوان : ?admin=1

أي , ومع وجود المتحولات العامة المسجلة مفعلة register_globals On , فإنه سيتم إيجاد المتحول $admin بشكل أوتوماتيكي واسناد القيمة 1 له,التي تكافئ القيمة المنطقية TRUE .

وهنا تكمن خطورة تفعيل register_globals , إذ أنها تمكن المستخدمين من حقن الكثير من المتحولات والقيم التي يرغبون بها إلى البرامج! أما في  حالتنا – المثال المذكور سابقاً – فإنه بإمكان أي شخص كان الدخول بصفته مدير النظام الذي يتمتع بكافة الصلاحيات على الرغم من كونه غير مخول للدخول لهذه الصفحات , ومع ذلك , فإنه دخوله لها لم يكلفه إلا بعملية حقن العنوان ببعض الإضافات الصغيرة!

وكما ترون , فإن مثل هذه الحالة يمكن أن تحدث لأي شخص , من قبل أي شخص يتمتع بقليل من التفكير المنطقي الذكي وبحدس بسيط يخمن عبره الآلية التي يتم وفقها برمجة الصفحة.

هنالك مثال آخر , ألا وهو مثال الجلسات sessions.

فإنه بإمكاننا أيضاً استخدام المتحول $username– في المثال ادناه – ويجب علينا أن ندرك بإنه بالمثل , وبحسب الشرح السابق فإن المتحول $username يمكن أن يأتي بوسائل وأساليب أخرى مثل GET ( أي عبر العنوان).


3: الاستخدام الأمثل.

تكمن الطريقة المثلى للتخلص من مثل هذه الهفوات والأخطاء البسيطة في الرماز – والتي ينتج عنها مخاطر أمنية كبيرة – وذلك بالتأكد من أن register_globals غير مفعلة في ملف إعدادات php (php.ini).

نصيحة عامة: قم دائماً بتهيئة المتحولات التي تستخدمها قبل استخدامها .

إن الرماز التالي يقوم بإجراء بعض التعديلات والإضافات على الرماز السابق, حيث يقوم بإسناد القيمة المنطقية FALSE للمتحول $admin , وبذلك لن يستطيع المستخدم من الحصول على صلاحيات مدير النظام عبر القيام ببعض الإضافات للعنوان , وبذلك نحمي صفحاتنا البرمجية قدر الإمكان :



4: للاستزادة

لمزيد من المعلومات والتفاصيل ,بالإمكان مراجعة الرابط التالي:

PHP Manual: Register Globals Security

وإلى لقاء قريب , استودعكم الله والسلام عليكم ورحمة الله وبركاته

المحررون: م.نور

, , , , ,

  1. #1 by محمد ديوب on أغسطس 5, 2008 - 3:32 م

    مشكور جداً على ترجمة هذه المقالة المفيدة حقاً و التي علمتني أشياء كنت أجهلها

  2. #2 by jehazee on مارس 23, 2009 - 8:45 م

    حياك استاذي

    بصراحه ماقصرت ربي يعطيك العافيه

    وانا دائما احب اسوي في ملف install.php دالة التاكذ من قعالية هذه الداله في السيرفر ففي حالة ما تكون مفعله لايقوم البرنامج باكمال عملية التثبيت الا بعد ايقاف register_global

    انا بس اريد اعرف اذا كانت هذه الداله لهذه الدرحه تهدد برمجياتنا فاذا لم قد يستخدمها البعض في برمجياتهم او انها فقط للشبكات الداخليه ومحتاجاتها ..

    على العموم شكرا وما قصرت استاذي جزاك الله خير

  3. #3 by احمد on أبريل 17, 2009 - 10:54 ص

    جميل جدا المقال شكرا لترجمة

أضف تعليقاً

Please log in using one of these methods to post your comment:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s

%d مدونون معجبون بهذه: