السلام عليكم ورحمة الله وبركاته
لقد قرأت البارحة هذه المقالة التي تتحدث عن بعض الجوانب الأمنية الهامة في لغة 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 , وبذلك لن يستطيع المستخدم من الحصول على صلاحيات مدير النظام عبر القيام ببعض الإضافات للعنوان , وبذلك نحمي صفحاتنا البرمجية قدر الإمكان :
لمزيد من المعلومات والتفاصيل ,بالإمكان مراجعة الرابط التالي:
PHP Manual: Register Globals Security
وإلى لقاء قريب , استودعكم الله والسلام عليكم ورحمة الله وبركاته
المحررون: م.نور





نشرت بواسطة schwarztiger