استخدام الجلسات Sessions in php

Mephistophelesمنذ 8 سنوات

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

اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا انك انت العليم الحكيم

 

كمستخدم للانترنت ربما تسائلت يوما كيف يقوم الموقع بالتعرف عليك او كيف يحتفظ بمعلوماتك الشخصية كلونك المفضل او تنسيقك المفضل, حسنا توجد العديد من الطرق التي يستخدمها مطوري المواقع لتسجيل بياناتك والاحتفاظ بها نذكر منها الجلسات sessions وهي ما سأكتب عنه في تدوينتي لهذا اليوم باذن الله ?

 

بسم الله الرحمن الرحيم

يمكن تعريف الجلسات على انها طريقة لتخزين المعلومات في متغييرات SESSIONS VARIABLES   ونقلها  بين صفحات موقعك المختلفة لتكون متاحة للاستخدام , على عكس الكوكيز cookies المعلومات لا تخزن في جهاز(متصفح) المستخدم,

انما تخزن في السيرفر . عندما تقوم بتفعيل الجلسات في موقعك سيقوم php بإنشاء كوكيز جديدة بإسم افتراضي PHPSESSID  يمكنك ان تغييره اذا اردت, حاوياً على قيمة value عشوائية وفريدة لايمكن تكرارها ومن الصعب جدا تخمينها تدعى session ID ويمكنك ان تعتبرها كمفتاح خاص بك فقط يمكنك من الوصول تلقائيا لمعلوماتك المخزنة في السيرفر SESSIONS VARIABLES , سيقوم الموقع بعرض المحتوى المقترن مع مفتاح المستخدم الخاص SESSION ID .

اذا كان المستخدم مفعل للكوكيز في متصفحه (ابعض المستخدين يلغونه) سيتم تمرير الsession ID عبر الكوكيز, في حالة تعطيل المستخدم للكوكيز سيتم تمرير  الsession ID اما عبر الURL او  باستخدام متغيير مخفي عن طريق POST.سأتكلم عن جميع الحالات باذن الله.

 

  • طريقة عمل الSESSION :

اولا لابد من بدء الجلسة 


session_start();

 

عند بدء الجلسة يقوم php بالتحقق من وجود جلسة مُقامة حاليا (لاكون اكثر دقة فهو يبحث عن وجود session ID ) اذا لم يجد سيقوم بانشاء جلسة جديدة بsession ID جديد , لكن اذا وجد جلسة مقامة سيقوم باستخدامها, في اي صفحة تريد ان تستعمل الSESSION VARIABLES بها لابد من كتابة الكود اعلاه .

ملاحظة مهمة يجب ان تكتب الكود قبل توليد اي OUTPUT يفضل كتابته في بداية السكربت.

 

الان بعد ان بدأت الجلسة يمكنك ان تخزن فيها قيم المتغييرات التي تريد, ستقوم بتخزين القيم التي تريد في مصفوفة جاهزة بالشكل التالي


$_SESSION['SESSION_VARIABLE'] = "VALUE";

الان  يمكنك الوصول للقيمة "VALUE" التي كتبتها في اي مكان تريده في موقعك باستخدام SESSION_VARIABLE الذي ادخلته 

مثال بسيط لتوضيح م شرحت حتى الان

لنفترض ان لدينا صفحة بهذا الشكل 


<?php
session_start();
$_SESSION['name'] = "mohamed";
echo " <a href='session.php'> got to the next page <a/>";

 

111.PNG

 

كما ترى في بادئ الامر لابد من بدء الجلسة ثم تخزين متغييرات في session vaiable يمكنك ان تكتب اي اسم تريد بدلا عن name والقيمة التي تم تخزينها كما هو واضح اسم "mohamed"

قام PHP بانشاء SESSION ID في كوكيز, وتم إقرانها بالSESSION VARIABLE والتي هي في حالتنا متغيير واحد الا وهو اسم "محمد"

بعد ذلك الصفحة قامت بتوليد OUTPUT رابط يودي للصفحة التالية 


<?php

session_start();

echo "name is : ".$_SESSION['name'];

ستقوم هذه الصفحة بطباعة 

name is : mohamed 

 

وما يحدث في الخلفية سيكون كالتالي تقريبا

  1. php يقرأ دالة session_start ثم يقرر تبعا ان يستخدم الsession ID (إن وجد) الخاص بالمستخدم.
  2. يتم الوصول للمتغيرات SESSION VARIABLE المقترنة مع الSESSION ID الخاص بالمستخدم , المخزنة في السيرفر.

يمكنك ان تحذف الكوكيز المخزنة وتذهب للصفحة الثانية وسحدث التالي:

  1. سيتم اعطائك SESSION ID جديد 
  2. سيظهر خطأ عندما يحاول اباتشي جلب المتغييرات لان SESSION ID الخاص بك لا توجد اي قيم مقترنة معه.?

ملاحظة: يمكنك الوصول للكوكيز في متصفح uc browser عن طريق  tool > developer tools > resources > cookies

 

كما ترى توصلنا لهذه النتيجة لاني مُفعل الكوكيز في متصفحي, ماذا لو قمت بتعطيله ؟ سينتج عن خطأ بالطبع لعدم توفر كوكيز لphp لكي يخزن فيها sessions

 يتوجب عليك حينها ان تفعل خاصية trans-sids  في ملف php.ini.

حسنا في حالة عدم توافر الكوكيز لن يكون لديك وسيط لتنقل الsessions عبره لحسن الحظ لغة php وفرت constant يدعى SID يحوي بداخله الsession ID وسيتوجب عليك نقل الsession ID بنفسك بين الصفحات

لا تقلق فالأمر ليس صعبا جدا,,

اولا نقل الsession ID عن طريق الURL 


 <?php
session_start();

$_SESSION['name'] = "MOHAMED";
?>
<p>
go to next page <a href="session.php?<?php echo SID; ?>">click
here</a>.
</p>

الSID يحوي قيم بالنحو التالي VARIABLE=NAME او PHPSESSID=enqh0mo7de8rgqbf5tqnmqluf5  ملاحظة الرقم بالاصفر  هو الsession ID الخاص بك وسيتم  تمريره عبر الURL لاستخدامه في الصفحة الاخرى.

 

session.php


<?php
//اجبار الجلسات ان لا يتم تخزينها في الكوكيز 
 ini_set("session.use_cookies", 0);
 ini_set("session.use_only_cookies", 0);
 ini_set("session.use_trans_sid", 1);
 ini_set("session.cache_limiter", "");

    session_start();
    echo    $_SESSION['name'];

 

طبعا الاسطر الاربعة الاولى يمكنك ان تعدلها عن طريق ملف الphp.ini لكن بافتراض ان ليس لديك صلاحية الوصول اليه دائما, يمكنك كتابة هذه الاوامر التي ستفعل trans_sid لتسمح لنا بنقل مفتاح الجلسة بدون كوكيز ?

بالطبع لدواعي امنية يجب تجنب استخدام الURL لنقل البيانات.

 

لذلك يفضل استخدام الPOST hidden fields وهي عبارة عن حقول مخفية كالتالي
 


<?php
//بدء جلسة وتخزين متغييرات
session_start();
$_SESSION['name'] = "mohamed";
//الحالي فيه session id عمل متغيير جديد باي اسم تريد وتقوم بتخزين ال
$SID = session_id();
// form عمل 
echo "<form action='session.php' method='POST'>

<input type='hidden' name='PHPSESSID'
value='$SID'>
<input type='submit' value='Next Page'>
</form>";

 


<input type='hidden' name='PHPSESSID'

من المهم ترك النوع type='hidden' وكذلك الاسم لابد من وضعه name='PHPSESSSID' كما هو ليتعرف عليه php في الصفحة التالية على انه جزء من حقل مخفي يحوي معلومات تخص الsession 

بالطبع بكتابة سكربتك بالشكل اعلاه والصفحة الثانية تتركها كما اوردتها في المثال الاول لن تواجه مشاكل حتى اذا قام المستخدم بتعطيل الكوكيز ?

 

 

 

  • حماية الsessions

 

           كما تعلم الsession ID يعتبر كمفتاح يُعَرف السيرفر على المستخدم واذا تمت سرقته من قبل احد المخترقين فهذا يعني إمكانية دخول المخترق بإسم الضحية ,,

توجد اكثر من طريقة مستخدمة لسرقة الكوكيز سأتكلم من الناحية البرمجية, اما من ناحية الشبكات والتجسس وهجومات MAN IN THE MIDDLE وغيرها استخدام SSL بروتوكول HTTPS سيوفر لك حماية معقولة 

يمكن ان تتم السرقة عن طريق ثغرة XSS حيث يمكن للمستخدم فقط كتابة كود جافاسكربت التالي


document.cookie

ليتحصل على الكوكيز المتوفرة عند المُستهدف وتوجيهها الى السيرفر الخاص به فيما بعد.

يمكنك مراجعة تدوينتي السابقة لمعرفة تدابير الحماية المتبعة للحماية من هجوم xss هنا , طريقة اخرى لتجنب هذه الثغرة عبر إعداد php بعدم السماح لجافاسكربت ان تتفاعل مع الكوكيز , واقصار التعامل فقط مع بروتوكول http عبر تعديل ملف php.ini 

session.cookie_httponly = 1  او يمكنك كتابة الكود التالي 


ini_set('session.cookie_httponly', true);

 

ومن الجيد ايضا القيام بالتدبير الامني الاتي,,

بما ان فكرة سرقة الجلسات تقوم على معرفة الSID واستخدامه ستقوم بإقران الSID مع قيمة خاصة بالمستخدم في هذا المثال ساستخدم الUSER AGENT وهي عبارة عن نص يقوم المتصفح بإرساله للسيرفر ليعرف عن نفسه

على حسب المتصفح يختلف النص المرسل.


<?php
session_start();
//sessionوتخزينه باحد متغيرات ال postاستلام الاسم المرسل عن طريق ال
$_SESSION['name'] = $_POST['name'];
//create a new session variable, containing the user browser info 
$_SESSION['browser'] = $_SERVER['HTTP_USER_AGENT'];

echo "<br> <a href='session.php'> next page </a>";
?>
<html><body>
    <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
    Name: <input type="text" name="name">
  <input type="submit" name="submit">
    </form>
</body></html>

 

الان بعد ان قمت بتخزين بيانات المتصفح الخاص بالمستخدم, في الصفحة التالية ستقوم بمقارنته ورؤية اذا ما تغيير ام لا.


<?php
    session_start();
//عمل حالة شرطية للمقارنة
if ($_SESSION['browser'] !== $_SERVER['HTTP_USER_AGENT']) {
  //sessionانهاء ال
    session_destroy();
    echo "you are not authenticated.";
    exit();
    }
    echo $_SESSION['name'];

 

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

مثال

لنفترض ان المستخدم الاول قام بادخال اسمه

session1.png

 

هنا استخدم متصفح uc browser ,, كما ترى تم عمل جلسة جديدة الSID محدد باللون الاحمر, وبمجرد ان يقوم المستخدم بضغط زر SUBMIT  سيتم حفظ الاسم في الsession variables , لنفرض جدلا ان هناك من يحاول معرفة اسم المستخدم السري بعد ان قام طبعا بسرقة الSID الخاص به, لعمل هذا السيناريو ساقوم بالدخول بمتصفح اخر (فايرفوكس) 

session2.png

 

بعد ان قام المخترق بالتوجه مباشرة نحو صفحة session.php قام بتغيير الSID للذي قام بسرقته 

session3.png

 

لكن بعد ان يقوم PHP بعمل الحالة الشرطية ويرى ان قيمة الuser agent مختلفة سيقوم بعرض رسالة واغلاق الجلسة, رغم ان المخترق سرق الSID الا انه لا يستطيع الاستفادة منه بسبب الحالة الشرطية التي صنعناها ?

 

في سبيل التبسيط(ولكي تقوم بتجريته بنفسك) قمت باستعمال مثال يعتمد على الuser agent والتي يمكن للمخترق ان يتحصل عليها لكن يمكنك ان تطبق نفس المنهجية على امور اخرى مثل ip address او تقوم بتشفير القيم باستخدام دالة sh1 ليصبح امر التخمين للمخترق شبه مستحيل.


sha1($_SESSION['browser']);

 

تم, ان كان صواب فمن الله وان كان غير ذلك مني ومن الشيطان .

 

كلمات دليلية:
3
إعجاب
18962
مشاهدات
0
مشاركة
1
متابع

التعليقات (1)

Simo:

راااائع أخي

 كم كنت أحتاج هذه المعلومات ! جزائك خير إنشاء الله

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !