Session In PHP

🟨 ما هي الجلسة (Session) في PHP؟
✅ التعريف:

الجلسة (Session) تُستخدم لتخزين معلومات المستخدم بشكل مؤقت على السيرفر أثناء زيارته للموقع. على عكس الكوكيز التي تُخزن في جهاز المستخدم، يتم تخزين بيانات الجلسة في ملفات على السيرفر، والمستخدم يحصل فقط على معرّف فريد (Session ID).

🧠 الفائدة:
  • حفظ معلومات تسجيل الدخول.
  • تتبع نشاط المستخدم.
  • مشاركة البيانات بين الصفحات بأمان.
  • أكثر أمانًا من الكوكيز لأنها لا تظهر في المتصفح.
⚙️ كيف تعمل الجلسة؟
  1. المتصفح يزور الموقع.
  2. PHP يُنشئ جلسة على السيرفر ويعطي المتصفح Session ID.
  3. هذا المعرف يُرسل من المتصفح في كل طلب (عبر الكوكي).
  4. السيرفر يربط Session ID بملف الجلسة المخزَّن.
🟢 بدء جلسة جديدة: session_start()

قبل استخدام أي متغيرات جلسة، يجب دائمًا استدعاء session_start() في أعلى الملف:

<?php
session_start();
?>
PHP

🔺 ملاحظة: يجب أن تأتي قبل أي مخرجات (echo، HTML)

🔷 تخزين بيانات في الجلسة:
session_start();
$_SESSION["username"] = "Yasin";
$_SESSION["role"] = "student";
PHP
🔸 قراءة بيانات الجلسة:
session_start();
echo $_SESSION["username"]; // Yasin
PHP
🔹 التحقق من وجود بيانات في الجلسة:
if (isset($_SESSION["username"])) {
    echo "مرحبا " . $_SESSION["username"];
}
PHP
🔻 تعديل بيانات الجلسة:
$_SESSION["username"] = "Ahmed";
PHP
❌ حذف متغير من الجلسة:
unset($_SESSION["username"]);
PHP
🗑️ حذف كل بيانات الجلسة:
session_unset(); // يحذف كل القيم من $_SESSION
PHP
🚫 إنهاء الجلسة بالكامل:
session_destroy(); // يحذف الجلسة نهائيًا
PHP
🧾 أين يتم تخزين الجلسات؟
  • في مجلد مؤقت على السيرفر، مثل:
    /tmp/sess_abc123xyz...
  • اسم الملف يحتوي على Session ID
🔐 الأمان في الجلسات:
الأسلوبالفائدة
session_regenerate_id()لتغيير الـ ID بشكل منتظم لتفادي سرقة الجلسة
استخدام HTTPSلمنع اختراق البيانات
ضبط مدة صلاحية الجلسةعن طريق php.ini أو الكود
💡 مثال تطبيقي كامل:
🟨 login.php
<?php
session_start();
$_SESSION["user"] = "Yasin";
echo "تم تسجيل الدخول.";
?>
PHP
🟦 profile.php
<?php
session_start();
if (isset($_SESSION["user"])) {
    echo "أهلاً بك " . $_SESSION["user"];
} else {
    echo "يرجى تسجيل الدخول أولاً.";
}
?>
PHP
🟥 logout.php
<?php
session_start();
session_unset();
session_destroy();
echo "تم تسجيل الخروج.";
?>
PHP
✅ مقارنة سريعة بين Cookie و Session:
المعيارCookieSession
مكان التخزينالمتصفح (جهاز المستخدم)السيرفر
الأمانأقلأعلى
الحجممحدود 4KBأكبر
مدة الحياةيتم التحكم بها يدويًاتنتهي بإغلاق المتصفح أو السيرفر
📌 نصائح مهمة:

✅ افعل:

  • استخدم session_start() في كل صفحة تحتاج الجلسة.
  • امسح الجلسة عند تسجيل الخروج.
  • استخدم session_regenerate_id() بعد تسجيل الدخول.

❌ لا تفعل:

  • لا تخزن بيانات حساسة مثل كلمات المرور بنص واضح.
  • لا تنسَ بدء الجلسة قبل استخدام $_SESSION.
🕒 أولًا: Session Lifetime (مدة صلاحية الجلسة)
📌 ما المقصود بها؟

هي الفترة الزمنية التي تبقى فيها الجلسة نشطة قبل أن تُحذف تلقائيًا من السيرفر إذا لم يقم المستخدم بأي تفاعل.

⚙️ التحكم بمدة الجلسة:
  1. عبر ملف الإعداد php.ini:
session.gc_maxlifetime = 1800 ; مدة الجلسة بالثواني (مثلاً: 1800 = 30 دقيقة)
PHP
  1. أو داخل الكود مباشرة:
ini_set('session.gc_maxlifetime', 1800); // 30 دقيقة
session_start();
PHP
  1. ⛔ ملاحظة:
    يجب التأكد أن إعدادات السيرفر لا تحذف ملفات الجلسة قبل هذه المدة من خلال:
session.save_path = "/tmp" // تأكد أن هذا المجلد لا يتم مسحه تلقائيًا
PHP
🔐 ثانيًا: Session Security Settings (إعدادات الأمان)
✅ تأمين الجلسة يشمل:
  • منع سرقة الـ Session ID
  • منع التلاعب في البيانات
  • التحكم في صلاحية الجلسة
🔒 أهم إعدادات الأمان:
الإعدادالفائدة
session.cookie_httponlyيمنع الوصول للجلسة من JavaScript (يحمي من XSS)
session.cookie_secureيسمح بإرسال الـ Session فقط عبر HTTPS
session.use_strict_modeيمنع إنشاء جلسات ID عشوائية غير صالحة (تحسين الأمان)
session.use_only_cookiesيمنع تمرير Session ID في الرابط (يحمي من hijacking)
✅ تفعيلها بالكود:
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.use_strict_mode', 1);
session_start();
PHP
🔁 ثالثًا: Regenerating Session ID
📌 لماذا نحتاجها؟

لمنع سرقة الجلسة عبر الهجمات مثل Session Fixation.

🔄 الطريقة:
session_start();
session_regenerate_id(true); // يُنصح بتفعيله بعد تسجيل الدخول
PHP
  • true: لحذف الجلسة القديمة تلقائيًا.
📦 رابعًا: Session Storage Customization
🧭 أين تُخزّن الجلسات افتراضيًا؟

في ملفات داخل مجلد /tmp (أو ما يُحدده session.save_path)

📂 لتغيير مجلد التخزين:
session_save_path('/custom/sessions/path');
session_start();
PHP

✅ تأكد أن السيرفر لديه صلاحيات كتابة على هذا المسار.

🧠 خامسًا: Session Handlers (معالجات مخصصة للجلسات)
📌 يمكن تخزين الجلسات في:
  • قاعدة بيانات (MySQL, Redis)
  • ملفات
  • Memcached
لتخصيص معالج التخزين:

استخدم session_set_save_handler() أو مكتبات جاهزة مثل:

🔹 Redis Handler: سريع جدًا للأداء العالي
🔹 Database Handler: عندما تحتاج إدارة مركزية لكل الجلسات

مثال باستخدام قاعدة بيانات (بشكل مبسط):

session_set_save_handler(
  new YourCustomSessionHandler(), true
);
PHP
🧪 سادسًا: معرفة مسار ملفات الجلسة الحالية
echo session_save_path(); // يطبع مكان تخزين ملفات الجلسة
PHP
📊 سابعًا: عرض بيانات الجلسة
echo '<pre>';
print_r($_SESSION);
echo '</pre>';
PHP
⚠️ المحاذير العامة:
التحذيرالسبب
عدم استخدام session_start() مرتينيؤدي لخطأ في الإخراج
استخدام الجلسة دون تأمينقد تؤدي لاختراق الحسابات
ترك الجلسات مفتوحة طويلًااستهلاك موارد السيرفر
✅ نصائح احترافية:
  • استخدم session_regenerate_id() كل 10 دقائق أو بعد تسجيل الدخول.
  • امسح الجلسة بعد تسجيل الخروج بـ: phpCopyEdit$_SESSION = []; session_destroy();
  • لا تخزن معلومات حساسة مباشرة في الجلسة (مثل كلمة المرور).
  • استخدم تخزين قواعد بيانات في التطبيقات الضخمة.