في هذا الدرس 6تصفّح المواضيع
بمجرد تسجيل دخول المستخدم، يعمل معرف الجلسة (PHPSESSID) كمفتاح مصادقة مؤقت؛ ويستهدفه المهاجمون عبر مسارين رئيسيين: اختطاف الجلسة (Hijacking) وتثبيت الجلسة (Fixation).
- اختطاف الجلسة (Session Hijacking): يسرق المهاجم كوكيز
PHPSESSIDالنشطة عبر ثغرة XSS (document.cookie) أو عبر اتصال HTTP غير مشفر. - تثبيت الجلسة (Session Fixation): يخدع المهاجم الضحية لاستخدام معرف جلسة معروف مسبقاً قبل الدخول، ثم يستحوذ على الحساب فور توثيق الضحية لتلك الجلسة.
- يؤدي ضبط إعدادات الجلسة الصارمة وتدوير المعرف عند الدخول إلى إحباط كلا الهجومين.
يوضح فحص طبقة النقل أهمية منع إرسال كوكيز الجلسة عبر اتصالات HTTP غير المشفرة في بيئة الإنتاج.
<?php
// Verify whether the current request arrived over HTTPS
$isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| (($_SERVER['SERVER_PORT'] ?? 80) == 443);
echo "HTTPS Transport : " . ($isHttps ? "Encrypted" : "Plain HTTP") . "\n";
echo "Session Cookie : Must use Secure + HttpOnly + Strict Mode\n";
يقبل 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() الثلاثة قبول معرفات الجلسة حصرياً من الكوكيز التي أنشأها خادمك بنفسه.
<?php
ini_set('session.use_strict_mode', '1');
ini_set('session.use_only_cookies', '1');
ini_set('session.use_trans_sid', '0');
echo "use_strict_mode : " . ini_get('session.use_strict_mode') . "\n";
echo "use_only_cookies : " . ini_get('session.use_only_cookies') . "\n";
echo "use_trans_sid : " . ini_get('session.use_trans_sid') . "\n";
عندما يتغير مستوى صلاحيات المستخدم—وخصوصاً لحظة تسجيل الدخول أو ترقية الصلاحية أو تغيير كلمة المرور—يجب استدعاء الدالة session_regenerate_id(true).
- يؤدي تمرير المعامل
true(أي$delete_old_session = true) إلى حذف ملف الجلسة القديم فوراً من الخادم. - يتلقى المتصفح كوكيز جديدة بالمعرف المحدث بينما تظل جميع البيانات المحفوظة داخل مصفوفة
$_SESSIONسليمة كما هي. - يبطل هذا الإجراء تماماً أي معرف جلسة قديم كان موجوداً قبل تسجيل الدخول.
يضمن تدوير معرف الجلسة عند تعبئة $_SESSION["user_id"] عدم اشتراك جلسة المستخدم الموثقة في نفس المعرف القديم لجلسة الزائر.
<?php
function loginUserSession(int $userId, string $role): array {
// In web SAPI: session_regenerate_id(true);
$_SESSION['user_id'] = $userId;
$_SESSION['role'] = $role;
$_SESSION['authenticated'] = true;
$_SESSION['last_activity'] = 1762550000;
return $_SESSION;
}
$_SESSION = [];
$state = loginUserSession(42, 'admin');
echo "Logged in user #" . $state['user_id'] . " (" . $state['role'] . ")\n";
لا تعتمد فقط على جامع المهملات الاحتمالي في PHP (session.gc_maxlifetime) لإنهاء الجلسات الخاملة؛ بل تتبع الطابع الزمني $_SESSION["last_activity"] برمجياً في كل طلب.
- في كل طلب لمستخدم مسجل، افحص ما إذا كان
time() - $_SESSION["last_activity"] > $maxIdleSeconds. - إذا تجاوزت مدة الخمول الحد المسموح (مثل 1800 ثانية أي 30 دقيقة)، أفرغ مصفوفة
$_SESSIONودمّر الجلسة وحوّل المستخدم لصفحة الدخول. - أما إذا كانت الجلسة نشطة، فحدّث
$_SESSION["last_activity"] = time()لتمديد نافذة النشاط.
بما أن فترة الخمول البالغة 2400 ثانية تجاوزت الحد المسموح 1800 ثانية، يتم تفريغ الجلسة وإنهاؤها فوراً.
<?php
$now = 1762552000;
$maxIdle = 1800; // 30 minutes
$_SESSION = ['user_id' => 7, 'last_activity' => $now - 2400];
if (isset($_SESSION['last_activity']) && ($now - $_SESSION['last_activity']) > $maxIdle) {
$_SESSION = [];
echo "Session timed out after 1800s of inactivity!\n";
} else {
$_SESSION['last_activity'] = $now;
echo "Session active.\n";
}
اجمع إعدادات بدء الجلسة الآمنة في دالة تهيئة مركزية واحدة، وراجع جدول الإعدادات القياسية لتأمين الجلسات في 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_mode | 1 | Rejects uninitialized session IDs (anti-fixation) |
session.use_only_cookies | 1 | Forbids session IDs in URL query strings |
cookie_httponly | true | Blocks JavaScript document.cookie access |
cookie_secure | true | Sends cookie only over encrypted HTTPS |
cookie_samesite | "Lax" or "Strict" | Blocks cross-site POST cookie attachment |
session_regenerate_id(true) | On login / privilege change | Replaces session ID and deletes old file |
<?php
function buildSecureSessionConfig(bool $isHttps): array {
return [
'strict_mode' => true,
'httponly' => true,
'secure' => $isHttps,
'samesite' => 'Lax',
'idle_ttl' => 1800,
];
}
$cfg = buildSecureSessionConfig(true);
echo "SameSite=" . $cfg['samesite'] . " | IdleTTL=" . $cfg['idle_ttl'] . "s\n";
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
اجمع إعدادات بدء الجلسة الآمنة في دالة تهيئة مركزية واحدة، وراجع جدول الإعدادات القياسية لتأمين الجلسات في PHP. فعّل session.use_strict_mode وsession.use_only_cookies قبل كل استدعاء لـ session_start(). اضبط الأعلام httponly وsecure وsamesite => "Lax" عبر session_set_cookie_params(). استدعِ session_regenerate_id(true) عند تسجيل الدخول، وافرض فحص انتهاء الصلاحية عند الخمول.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم مخاطر اختطاف الجلسة وتثبيت معرف الجلسة للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم تفعيل الوضع الصارم session.use_strict_mode وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
ما المقصود بهجوم تثبيت الجلسة (Session Fixation)؟
إذا احتفظ الخادم بنفس معرف الجلسة بعد الدخول، يتمكن المهاجم من استخدام ذلك المعرف للوصول للحساب.
ماذا يفعل تفعيل الإعداد session.use_strict_mode = 1 في PHP؟
يمنع الوضع الصارم المهاجم من إجبار المتصفح على بدء جلسة بمعرف مختار مسبقاً.
متى يجب استدعاء الدالة session_regenerate_id(true)؟
توليد معرف جديد فور الدخول يبطل أي معرف قديم كان معروفاً قبل المصادقة.
ما الغرض من تمرير القيمة true إلى الدالة session_regenerate_id(true)؟
بدون تمرير true يبقى ملف الجلسة القديم صالحاً على القرص حتى يعمل جامع المهملات.
أي علم من أعلام الكوكيز يمنع كود JavaScript في المتصفح من قراءة كوكيز PHPSESSID عبر document.cookie؟
يمنع العلم HttpOnly وصول كود JavaScript إلى الكوكيز عبر document.cookie.
ماذا يفرض ضبط الخيار "secure" => true في دالة session_set_cookie_params()؟
يمنع علم Secure تسرب كوكيز الجلسة عبر اتصالات HTTP غير المشفرة.
لماذا يجب تتبع $_SESSION["last_activity"] برمجياً بدلاً من الاعتماد فقط على session.gc_maxlifetime؟
فحص الفارق الزمني برمجياً يفرض انتهاء الصلاحية بدقة حتمية في كل طلب.
متى يجب استدعاء session_set_cookie_params() و ini_set("session.use_strict_mode", "1")؟
يجب ضبط إعدادات الجلسة ومعاملات الكوكيز قبل بدء الجلسة بـ session_start().