انتقل إلى محتوى الدرس
الدرس 88
دورة PHP

تأمين الجلسات والكوكيز ضد الاختطاف وتثبيت الجلسة في PHPPHP Session Hardening and Cookie Security Flags

امنع اختطاف وتثبيت الجلسات في PHP 8 عبر session_regenerate_id والوضع الصارم وخصائص الكوكيز HttpOnly وSecure وSameSite.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

بمجرد تسجيل دخول المستخدم، يعمل معرف الجلسة (PHPSESSID) كمفتاح مصادقة مؤقت؛ ويستهدفه المهاجمون عبر مسارين رئيسيين: اختطاف الجلسة (Hijacking) وتثبيت الجلسة (Fixation).

  • اختطاف الجلسة (Session Hijacking): يسرق المهاجم كوكيز PHPSESSID النشطة عبر ثغرة XSS‏ (document.cookie) أو عبر اتصال HTTP غير مشفر.
  • تثبيت الجلسة (Session Fixation): يخدع المهاجم الضحية لاستخدام معرف جلسة معروف مسبقاً قبل الدخول، ثم يستحوذ على الحساب فور توثيق الضحية لتلك الجلسة.
  • يؤدي ضبط إعدادات الجلسة الصارمة وتدوير المعرف عند الدخول إلى إحباط كلا الهجومين.

يوضح فحص طبقة النقل أهمية منع إرسال كوكيز الجلسة عبر اتصالات HTTP غير المشفرة في بيئة الإنتاج.

مخطط توضيحي: محاكي تأمين الجلسات والكوكيز وانتهاء الصلاحية في PHP

يقبل PHP افتراضياً معرفات الجلسة غير المهيأة المرسلة من المتصفح؛ ويؤدي تفعيل session.use_strict_mode = 1 إلى إجبار PHP على رفض أي معرف جلسة لم يقم الخادم بإنشائه مسبقاً.

  • استدعِ ini_set("session.use_strict_mode", "1") وini_set("session.use_only_cookies", "1") قبل استدعاء session_start().
  • مع تفعيل الوضع الصارم، إذا أرسل مهاجم معرف جلسة محدد مسبقاً، يتجاهله PHP فوراً ويولد معرفاً عشوائياً جديداً.
  • اضبط هذه الإعدادات دائماً في ملف التهيئة المركزي للتطبيق أو داخل ملف php.ini.

تضمن أوامر ini_set() الثلاثة قبول معرفات الجلسة حصرياً من الكوكيز التي أنشأها خادمك بنفسه.

عندما يتغير مستوى صلاحيات المستخدم—وخصوصاً لحظة تسجيل الدخول أو ترقية الصلاحية أو تغيير كلمة المرور—يجب استدعاء الدالة session_regenerate_id(true).

  • يؤدي تمرير المعامل true (أي $delete_old_session = true) إلى حذف ملف الجلسة القديم فوراً من الخادم.
  • يتلقى المتصفح كوكيز جديدة بالمعرف المحدث بينما تظل جميع البيانات المحفوظة داخل مصفوفة $_SESSION سليمة كما هي.
  • يبطل هذا الإجراء تماماً أي معرف جلسة قديم كان موجوداً قبل تسجيل الدخول.

يضمن تدوير معرف الجلسة عند تعبئة $_SESSION["user_id"] عدم اشتراك جلسة المستخدم الموثقة في نفس المعرف القديم لجلسة الزائر.

قبل استدعاء session_start()، اضبط خصائص كوكيز الجلسة عبر دالة session_set_cookie_params() بتمرير مصفوفة خيارات ترابطية.

  • يخفي الخيار "httponly" => true كوكيز الجلسة عن كائن document.cookie في JavaScript، مما يمنع سرقتها عبر XSS.
  • يضمن الخيار "secure" => true عدم إرسال الكوكيز من المتصفح إلا عبر اتصالات HTTPS المشفرة.
  • يمنع الخيار "samesite" => "Lax" أو "Strict" إرسال الكوكيز مع طلبات POST العابرة للمواقع.

تقبل دالة session_set_cookie_params() مصفوفة ترابطية واضحة، وتطبق هذه الأعلام الأمنية فور إرسال كوكيز الجلسة عبر session_start().

مخطط تدفق التنفيذ العملي لقسم ضبط أعلام الكوكيز الآمنة HttpOnly و SameSite في لغة PHP

لا تعتمد فقط على جامع المهملات الاحتمالي في PHP‏ (session.gc_maxlifetime) لإنهاء الجلسات الخاملة؛ بل تتبع الطابع الزمني $_SESSION["last_activity"] برمجياً في كل طلب.

  • في كل طلب لمستخدم مسجل، افحص ما إذا كان time() - $_SESSION["last_activity"] > $maxIdleSeconds.
  • إذا تجاوزت مدة الخمول الحد المسموح (مثل 1800 ثانية أي 30 دقيقة)، أفرغ مصفوفة $_SESSION ودمّر الجلسة وحوّل المستخدم لصفحة الدخول.
  • أما إذا كانت الجلسة نشطة، فحدّث $_SESSION["last_activity"] = time() لتمديد نافذة النشاط.

بما أن فترة الخمول البالغة 2400 ثانية تجاوزت الحد المسموح 1800 ثانية، يتم تفريغ الجلسة وإنهاؤها فوراً.

اجمع إعدادات بدء الجلسة الآمنة في دالة تهيئة مركزية واحدة، وراجع جدول الإعدادات القياسية لتأمين الجلسات في PHP.

  • فعّل session.use_strict_mode وsession.use_only_cookies قبل كل استدعاء لـ session_start().
  • اضبط الأعلام httponly وsecure وsamesite => "Lax" عبر session_set_cookie_params().
  • استدعِ session_regenerate_id(true) عند تسجيل الدخول، وافرض فحص انتهاء الصلاحية عند الخمول.

يضمن تغليف إعدادات الجلسة في دالة موحدة تطبيق نفس معايير الأمان عبر جميع صفحات ومسارات التطبيق.

الإعداد / الدالةالقيمة الموصى بهاالدور الأمني
session.use_strict_mode1Rejects uninitialized session IDs (anti-fixation)
session.use_only_cookies1Forbids session IDs in URL query strings
cookie_httponlytrueBlocks JavaScript document.cookie access
cookie_securetrueSends cookie only over encrypted HTTPS
cookie_samesite"Lax" or "Strict"Blocks cross-site POST cookie attachment
session_regenerate_id(true)On login / privilege changeReplaces session ID and deletes old file

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

اجمع إعدادات بدء الجلسة الآمنة في دالة تهيئة مركزية واحدة، وراجع جدول الإعدادات القياسية لتأمين الجلسات في PHP. فعّل session.use_strict_mode وsession.use_only_cookies قبل كل استدعاء لـ session_start(). اضبط الأعلام httponly وsecure وsamesite => "Lax" عبر session_set_cookie_params(). استدعِ session_regenerate_id(true) عند تسجيل الدخول، وافرض فحص انتهاء الصلاحية عند الخمول.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Session Security تأمين الجلسات والكوكيز
امنع اختطاف وتثبيت الجلسات في PHP 8 عبر session_regenerate_id والوضع الصارم وخصائص الكوكيز HttpOnly وSecure وSameSite.
للمراجعة
02 Session Hijacking and Fixation Threats مخاطر اختطاف الجلسة وتثبيت معرف الجلسة
المفهوم الأساسي لقسم مخاطر اختطاف الجلسة وتثبيت معرف الجلسة في لغة PHP الحديثة.
للمراجعة
03 Enabling session.use_strict_mode تفعيل الوضع الصارم session.use_strict_mode
الصياغة البرمجية والتطبيق العملي المباشر لقسم تفعيل الوضع الصارم session.use_strict_mode.
للمراجعة
04 Regenerating IDs on Privilege Change توليد معرف جديد عند الدخول بـ session_regenerate_id
قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم توليد معرف جديد عند الدخول بـ session_regenerate_id.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 PHP PHP
PHP: Hypertext Preprocessor
لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
للمراجعة
02 CLI CLI
Command-Line Interface
واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
للمراجعة
03 FPM FPM
FastCGI Process Manager
مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
للمراجعة
04 HTML HTML
HyperText Markup Language
لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم مخاطر اختطاف الجلسة وتثبيت معرف الجلسة للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم تفعيل الوضع الصارم session.use_strict_mode وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ما المقصود بهجوم تثبيت الجلسة (Session Fixation)؟

إذا احتفظ الخادم بنفس معرف الجلسة بعد الدخول، يتمكن المهاجم من استخدام ذلك المعرف للوصول للحساب.

02

ماذا يفعل تفعيل الإعداد session.use_strict_mode = 1 في PHP؟

يمنع الوضع الصارم المهاجم من إجبار المتصفح على بدء جلسة بمعرف مختار مسبقاً.

03

متى يجب استدعاء الدالة session_regenerate_id(true)؟

توليد معرف جديد فور الدخول يبطل أي معرف قديم كان معروفاً قبل المصادقة.

04

ما الغرض من تمرير القيمة true إلى الدالة session_regenerate_id(true)؟

بدون تمرير true يبقى ملف الجلسة القديم صالحاً على القرص حتى يعمل جامع المهملات.

05

أي علم من أعلام الكوكيز يمنع كود JavaScript في المتصفح من قراءة كوكيز PHPSESSID عبر document.cookie؟

يمنع العلم HttpOnly وصول كود JavaScript إلى الكوكيز عبر document.cookie.

06

ماذا يفرض ضبط الخيار "secure" => true في دالة session_set_cookie_params()؟

يمنع علم Secure تسرب كوكيز الجلسة عبر اتصالات HTTP غير المشفرة.

07

لماذا يجب تتبع $_SESSION["last_activity"] برمجياً بدلاً من الاعتماد فقط على session.gc_maxlifetime؟

فحص الفارق الزمني برمجياً يفرض انتهاء الصلاحية بدقة حتمية في كل طلب.

08

متى يجب استدعاء session_set_cookie_params() و ini_set("session.use_strict_mode", "1")؟

يجب ضبط إعدادات الجلسة ومعاملات الكوكيز قبل بدء الجلسة بـ session_start().