تابع موضوعات المنتدى الانتساب تعليمات س - ج قائمة الأعضاء المفكرة بحث مواضيع اليوم إشارة الأقسام مقروءة

مواقع صديقة: تعلم البي اتش بي - تصميم نت - أفضل استضافة

قديم 17-01-2007, 05:02 AM   #1 (permalink)
مشرف قسم لغة بي اتش بي PHP
 
الصورة الرمزية لـ coder
 
تاريخ الانتساب: 24-12-2006
المكان: مصر
السن: 30
مشاركات: 1,724
مشاركات المدونة: 2
مستوى السمعة : 10
coder على طريق التميز و النجاح
افتراضي register_globals - دراسة مفصلة

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

نبذة عن المشكلة
مشكلة register_globals حدثت بعد طرح الاصدار PHP v.4.2.1، حيث تم جعل القيمة الافتراضية لـ register_globals تساوي off، مما أدى الى توقف الكثير والكثير من السكريبتات المطروحة قبل هذا الوقت والتي كانت تعتمد في عملها على الوضعية on لـ register_globals.

ولكن لماذا تم تغيير القيمة الافتراضية لهذه الخاصية؟
مما هو معروف لأي مبرمج متمرس ان هذا التغيير هو اكبر تغيير حدث في لغة PHP منذ انشائها، وهو لم يكن وليد الصدفة ولكن القرار كان صعب بالنسبة لمجتمع PHP لأن المشكلة هنا تتعلق بأمن البرمجة.
نعم المشكلة تتعلق بالأمن، لأن ترك الخاصية register_globals في الوضع on هو بمثابة ثغرة امنية خطيرة جداً، تؤدي الى وصول اي متصفح للسكريبت الى بيانات غير مصرح له برؤيتها.
وإليك هذا المثال لتوضيح خطر تشغيل الخاصية:
كود PHP:
<?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
يمكنك تعديل الملف الذي لا يعمل عن طريق اضافة الكود التالي الى بداية الملف:
كود PHP:
extract($_POST);
extract($_GET);
extract($_SESSION);
extract($_COOKIE); 
3- تشغيل الخاصية register_globals عن طريق ملف htacces
بالرغم من خطورة هذه الطريقة لما يترتب عليها من ثغرات في السكريبت، إلا أنها تبقى طريقة ناجحة وفعالة لتشغيل السكريبت على مسئوليتك الخاصة.
تقوم في هذه الطريقة برفع ملف htacces. يحتوي على الكود التالي:
كود:
php_flag register_globals on
بعد رفع الملف الى مجلد السكريت، يفترض ان يعمل السكريبت بشكل سليم.
__________________
لضمان رد سريع على استفسارك أو موضوعك
* تأكد من البحث في المنتدى قبل أن تسأل
* احرص على أن تنتقي العنوان المناسب لموضوعك أو سؤالك
* قم بصياغة سؤالك بطريقة واضحة مع ذكر تجربتك ومكان الخطأ فيها
coder غير متصل   رد مع اقتباس
قديم 17-01-2007, 05:03 AM   #2 (permalink)
pRO
عضو نشيط
 
تاريخ الانتساب: 15-01-2007
المكان: فلسطين
السن: 21
مشاركات: 86
مستوى السمعة : 2
pRO على طريق التميز و النجاح
إرسال خطاب MSN إلى pRO إرسال خطاب Yahoo إلى pRO مخاطبة pRO بواسطة برنامج المحادثة سكايب ( Skype )
افتراضي

مشكور يا غالى والى الأمام
__________________
- нαSαŋ -
pRO غير متصل   رد مع اقتباس
قديم 17-01-2007, 03:17 PM   #3 (permalink)
عضو جديد
 
تاريخ الانتساب: 15-01-2007
مشاركات: 15
مستوى السمعة : 0
مُجَاهِد على طريق التميز و النجاح
افتراضي

جزاك الله خير
__________________
بو مُجَاهِد
مُجَاهِد غير متصل   رد مع اقتباس
قديم 17-01-2007, 04:40 PM   #4 (permalink)
حسن من المغرب
ضيف
 
مشاركات: n/a
افتراضي شكراً جزيلاً

شكراً جزيلاً أخي الكريم لشرحك الرائع...
  رد مع اقتباس
قديم 23-01-2007, 07:14 PM   #5 (permalink)
مشرف قسم لغة بي اتش بي PHP
 
الصورة الرمزية لـ coder
 
تاريخ الانتساب: 24-12-2006
المكان: مصر
السن: 30
مشاركات: 1,724
مشاركات المدونة: 2
مستوى السمعة : 10
coder على طريق التميز و النجاح
افتراضي

اقتباس:
الكاتب : pRO عرض المشاركة
مشكور يا غالى والى الأمام
اقتباس:
الكاتب : مُجَاهِد عرض المشاركة
جزاك الله خير
اقتباس:
الكاتب : حسن من المغرب عرض المشاركة
شكراً جزيلاً أخي الكريم لشرحك الرائع...
مشكورين اخواني وجزاكم الله كل خير
__________________
لضمان رد سريع على استفسارك أو موضوعك
* تأكد من البحث في المنتدى قبل أن تسأل
* احرص على أن تنتقي العنوان المناسب لموضوعك أو سؤالك
* قم بصياغة سؤالك بطريقة واضحة مع ذكر تجربتك ومكان الخطأ فيها
coder غير متصل   رد مع اقتباس
قديم 05-02-2007, 04:36 PM   #6 (permalink)
عضو جديد
 
تاريخ الانتساب: 05-02-2007
مشاركات: 35
مستوى السمعة : 0
normal على طريق التميز و النجاح
افتراضي

اخوي coder بصراحه ابدعت وجزاك الله خير

ولكن عندي استفسار

عندي سكربت فرضا لا يعمل الا اقوم برفع ملف htacces. يحتوي على الكود التالي:
كود:
php_flag register_globals on
فما العمل >>> اللي فهمته من الموضوع هو تحويل المتغيرات العاديه الى
اقتباس:
بـ GET و POST
كيف اقوم بعمل المتغيرات بهذه الحاليه >>> هل كالتالي فرضا

كود PHP:
$normal $_GET['normal'
او كالتالي
كود PHP:
$normal $_GET['nor'
ايهما الاصح

وايضا المتغير هذا
كود PHP:
$_POST['variable'
ماالفرق بينه وبين السابق

مع العلم اني السكربت الذي لدي بصفحة العرض اقوم بعمل متغير عادي حتى يعرض لي المحتوى .

واسف للاطاله

قام بآخر تعديل normal يوم 05-02-2007 في 04:39 PM
normal غير متصل   رد مع اقتباس
قديم 05-02-2007, 05:13 PM   #7 (permalink)
مشرف قسم لغة بي اتش بي PHP
 
الصورة الرمزية لـ coder
 
تاريخ الانتساب: 24-12-2006
المكان: مصر
السن: 30
مشاركات: 1,724
مشاركات المدونة: 2
مستوى السمعة : 10
coder على طريق التميز و النجاح
افتراضي

أهلا ومرحبا اخي الكريم

اقتباس:
عندي سكربت فرضا لا يعمل الا اقوم برفع ملف htacces. يحتوي على الكود التالي:
كود:
php_flag register_globals on
كما ذكرت في الدرس هذه الطريقة هي آخر الطرق التي ينبغي ان تلجأ لها.. لأنها تتسبب في فتح ثغرات في السكريبت..

اقتباس:
فما العمل >>> اللي فهمته من الموضوع هو تحويل المتغيرات العاديه الى
فالحل الأفضل هو:
ان تستخدم المصفوفتين $_GET و $_POST لاستقبال هذه المتغيرات
بمعنى لو كان رابط السكريبت بهذا الشكل: index.php?action=register وهو يعبر عن المتغير action ممرر بالطريقة GET ...
فلا تستقبل قيمة المتغير بالطريقة $action بل استخدم بدلا منها
كود PHP:
$_GET['action'
تحياتي
__________________
لضمان رد سريع على استفسارك أو موضوعك
* تأكد من البحث في المنتدى قبل أن تسأل
* احرص على أن تنتقي العنوان المناسب لموضوعك أو سؤالك
* قم بصياغة سؤالك بطريقة واضحة مع ذكر تجربتك ومكان الخطأ فيها
coder غير متصل   رد مع اقتباس
قديم 05-02-2007, 06:35 PM   #8 (permalink)
عضو جديد
 
تاريخ الانتساب: 05-02-2007
مشاركات: 35
مستوى السمعة : 0
normal على طريق التميز و النجاح
افتراضي

تسلم اخوي coder وقواك الله

بمعنى ان المتغير سيصبح بالشكل النهائي هكذا

$action = $_GET['action'];

=========

طيب معلش ياغالي لازم استوعب الشغله علشان ترسخ المعلومه
وعملت مثال على هالطريقه اللي شرحتها انت وما ادري هل صحيحه ام لا !!

كود PHP:
<?php
include("config.php");

if(!isset(
$action)) $action $_GET['one'];
IF (
$action=="one"){

$op1 "alslam alicom wrhmt allah wbrkath<br><br>";
$op2 "welcom to my site<br>";
$op3 "very very nice<br>";
echo 
"$op1";
echo 
"$op2";
echo 
"$op3";


}ELSEIF (
$action=="tow"){
$op1_1 "goooood morning<br><br>";
echo 
"$op1_1";


}ELSEIF (
$action=="three"){
echo 
"<br>";
echo 
"<br><br>";
$stats mysql_query("select * from news");
$text_stats mysql_num_rows($stats);
echo 
"news number $text_stats .";


$sql    "SELECT * FROM news where id=$id";
$result mysql_query ($sql) or die ("Query failed");
$row    mysql_fetch_array($result);
$num_id   $row['id'];
$num_name $row['name'];
$num_web  $row['link'];
}
?>
>>>>>> هل الاستعلامات بالشكل الصحيح ام لابد من اضافة المتغيرات جيت لها !!

وما الفرق بين كلا من GET و POST أو كلاهما يلبي الغرض !!


وشاكر لك سعة صدرك
normal غير متصل   رد مع اقتباس
قديم 06-02-2007, 04:19 AM   #9 (permalink)
مشرف قسم لغة بي اتش بي PHP
 
الصورة الرمزية لـ coder
 
تاريخ الانتساب: 24-12-2006
المكان: مصر
السن: 30
مشاركات: 1,724
مشاركات المدونة: 2
مستوى السمعة : 10
coder على طريق التميز و النجاح
افتراضي

اقتباس:
بمعنى ان المتغير سيصبح بالشكل النهائي هكذا

$action = $_GET['action'];
كلام سليم

اقتباس:

طيب معلش ياغالي لازم استوعب الشغله علشان ترسخ المعلومه
وعملت مثال على هالطريقه اللي شرحتها انت وما ادري هل صحيحه ام لا !!

كود PHP:
<?php
include("config.php");
 
if(!isset(
$action)) $action $_GET['one'];
IF (
$action=="one"){
 
$op1 "alslam alicom wrhmt allah wbrkath<br><br>";
$op2 "welcom to my site<br>";
$op3 "very very nice<br>";
echo 
"$op1";
echo 
"$op2";
echo 
"$op3";
 
 
}ELSEIF (
$action=="tow"){
$op1_1 "goooood morning<br><br>";
echo 
"$op1_1";
 
 
}ELSEIF (
$action=="three"){
echo 
"<br>";
echo 
"<br><br>";
$stats mysql_query("select * from news");
$text_stats mysql_num_rows($stats);
echo 
"news number $text_stats .";
 
 
$sql    "SELECT * FROM news where id=$id";
$result mysql_query ($sql) or die ("Query failed");
$row    mysql_fetch_array($result);
$num_id   $row['id'];
$num_name $row['name'];
$num_web  $row['link'];
}
?>
المثال صحيح 100%
والاستعلامات أيضاً صحيحة ولا يجب أن تستخدم هنا في هذا المثال المتغيرات GET في الاستعلام
ولكن مثلا في حال انك تريد عرض بيانات عن العميل رقم 15 في عملاء الشركة
فيصبح مثلا رابط السكريبت المسئول عن ذلك بهذه الطريقة
show.php?customer=15
فتقوم انت باستقبال قيمة رقم العميل من الرابط والاستعلام عنها في الداتابيز كالتالي:
كود PHP:
$customer intval($_GET['customer']);
$query "SELECT * FROM `customers` WHERE id=$customer"
ستلاحظ في السطر الأول من الكود اننا استخدمنا الدالة intval ووظيفتها هو التحقق من ان القيمة الممررة في الرابط رقم صحيح وارجاع هذا الرقم اما ان لم يكن رقم صحيح فسترجع القيمة صفر، والغرض منها هو الأمان بالدرجة الأولى ولتجنب مخاطر الـ SQL INJECTION.

اقتباس:
وما الفرق بين كلا من GET و POST
أو كلاهما يلبي الغرض !!
الفرق بينهما واضح جداً
فالمصفوفة GET تعبر عن المتغيرات الممررة في رابط السكريبت مثل المثال السابق
اما المصفوفة POST فتعبر عن المتغيرات الممررة في النماذج من النوع POST مثل النماذج التي تستخدم لتسجيل الدخول او لتغيير كلمات المرور او اي حالة لا نريد البيانات ان تظهر في رابط الملف، حيث انها لا تظهر المتغيرات في رابط الملف مثل الطريقة GET (اقرأ أكثر عن النماذج GET و POST)
وان شاء الله اقوم بوضع دروس توضح انواع النماذج وفيم يستخدم كل نوع قريبا جداًً....

تحياتي لك
__________________
لضمان رد سريع على استفسارك أو موضوعك
* تأكد من البحث في المنتدى قبل أن تسأل
* احرص على أن تنتقي العنوان المناسب لموضوعك أو سؤالك
* قم بصياغة سؤالك بطريقة واضحة مع ذكر تجربتك ومكان الخطأ فيها
coder غير متصل   رد مع اقتباس
قديم 06-02-2007, 04:26 PM   #10 (permalink)
عضو جديد
 
تاريخ الانتساب: 05-02-2007
مشاركات: 35
مستوى السمعة : 0
normal على طريق التميز و النجاح
افتراضي

اخوي coder لاهنت ياغالي وقواك ربي

رسخت المعلومه ان شاء الله

والله لايحرمك الأجر ان شاء الله
normal غير متصل   رد مع اقتباس
إضافة رد


زوار هذا الموضوع الآن : 1 (0 عضو و 1 ضيف)
 

(View-All Members who have read this thread : 17
محمد اليماني, alQana9, السولافي, Dap, dr.hussein, Dreamweaver, بلال كيالي, faris3d, يوسف الحمود, magoo_2003, Oh Yeah, rammstein, Sinator Programmer, Tamem Graphics, علي عبدالعزيز, غزوان, همام نداف
أدوات الموضوع
طريقة العرض
عادي عادي

ضوابط المشاركة
غير مصرّح لك بنشر موضوع جديد
غير مصرّح لك بنشر ردود
غير مصرّح لك برفع مرفقات
غير مصرّح لك بتعديل مشاركاتك

وسوم vB : نشيط
كود [IMG] : نشيط
كود هتمل : خامل
Trackbacks are نشيط
Pingbacks are نشيط
Refbacks are نشيط
الانتقال السريع


يمنع نقل أي من موضوعات المنتدى دون إذن كتابي مسبق من إدارة المنتدى، مع الشكر.
التوقيت حسب جرينتش +3. الساعة الآن 08:56 PM.