Kodokon kodokon.com

الجلسات وملفات تعريف الارتباط: تسجيل الدخول وسلة التسوق

تذكَّر زوّارك من صفحة إلى أخرى: تسجيل دخول آمن، وسلة تسوق قائمة على الجلسة، وملفات تعريف ارتباط محميّة كما ينبغي.

10 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

لا تتذكّر HTTP شيئًا: فكل طلب يصل جديدًا، دون رابط بالطلب السابق. تحلّ الجلسات هذه المشكلة: تربط session_start() الزائر بمُعرِّف فريد، يُنقَل في ملف تعريف ارتباط، وبمساحة تخزين من جهة الخادم يمكن الوصول إليها عبر $_SESSION. استدعِ session_start() في أعلى كل صفحة معنية تمامًا، قبل أيّ مُخرَجات.

PHP
<?php

declare(strict_types=1);

session_start();

$storedHash = password_hash('secret123', PASSWORD_DEFAULT);
$password = $_POST['password'] ?? '';

if (password_verify($password, $storedHash)) {
    session_regenerate_id(true);
    $_SESSION['user_id'] = 42;
    header('Location: /account.php');
    exit;
}

echo "Invalid credentials.";
login.php: في الواقع، تأتي قيمة التجزئة من قاعدة بياناتك.

تنحصر حماية صفحة في التحقق من وجود المستخدم في الجلسة، وإعادة توجيهه فيما عدا ذلك. وتصلح الجلسة أيضًا كمخزن مؤقت مثالي لـ سلة تسوق: فمصفوفة ترابطية product id => quantity تبقى من صفحة إلى أخرى.

PHP
<?php

declare(strict_types=1);

session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: /login.php');
    exit;
}

$_SESSION['cart'] ??= [];

$productId = filter_input(
    INPUT_POST,
    'product_id',
    FILTER_VALIDATE_INT
);

if (is_int($productId)) {
    $qty = $_SESSION['cart'][$productId] ?? 0;
    $_SESSION['cart'][$productId] = $qty + 1;
}

$count = array_sum($_SESSION['cart']);
echo "Cart: " . $count . " item(s)";
cart.php: صفحة محميّة وسلة مخزّنة في الجلسة.

أما ملفات تعريف الارتباط، فتعيش على جهاز المستخدم وتبقى بعد إغلاق المتصفح: وهي مثالية لسمة العرض أو لتفضيل اللغة. ومنذ PHP 7.3، تقبل setcookie() مصفوفة من الخيارات: اشترط secure (عبر HTTPS فقط)، وhttponly (غير مرئي لـ JavaScript)، وsamesite (يحدّ من الإرسال من مواقع أخرى).

PHP
<?php

setcookie('theme', 'dark', [
    'expires' => time() + 60 * 60 * 24 * 30,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

$theme = $_COOKIE['theme'] ?? 'light';
echo "Active theme: " . $theme;
ملف تعريف ارتباط لتفضيل، صالح لمدة ثلاثين يومًا، مع الرايات المناسبة.

يجب أن يكون تسجيل الخروج بالعناية نفسها التي يُنفَّذ بها تسجيل الدخول: أفرِغ $_SESSION، ودمّر الجلسة من جهة الخادم، وأنهِ صلاحية ملف تعريف الارتباط الذي كان يحمل المُعرِّف.

PHP
<?php

session_start();

$_SESSION = [];
session_destroy();

setcookie(session_name(), '', time() - 3600, '/');

header('Location: /login.php');
exit;
logout.php: تسجيل خروج كامل، دون ترك أيّ أثر.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. أين تُخزَّن بيانات جلسة PHP؟
    • في ملف تعريف ارتباط على جهاز المستخدم
    • على الخادم؛ ولا يحتفظ المتصفح إلا بمُعرِّف في ملف تعريف ارتباط
    • في عنوان URL لكل صفحة
    • في localStorage الخاص بالمتصفح
  2. لماذا تستدعي session_regenerate_id(true) مباشرة بعد تسجيل دخول ناجح؟
    • لمنع تثبيت الجلسة (session fixation): فيصبح المُعرِّف المعروف قبل تسجيل الدخول غير قابل للاستخدام
    • لتمديد عمر ملف تعريف ارتباط الجلسة
    • لمسح بيانات السلة القديمة
  3. ماذا يفعل خيار httponly في ملف تعريف الارتباط؟
    • يشفّر محتوى ملف تعريف الارتباط
    • يقصر ملف تعريف الارتباط على الاتصالات غير الآمنة
    • يجعل ملف تعريف الارتباط غير متاح لـ JavaScript الخاص بالصفحة، ما يحدّ من سرقته عبر XSS