PHP / متوسط: الكائنات والحفظ والاختبار / الدرس 11
الجلسات والكوكيز وملكية الحالة
افهم الجلسة دورة حالة خادم مرتبطة بمعرف عميل. افصل المصادقة والتصريح وتسليم الكوكيز والقفل ودليل التخزين المعزول.
في هذه الصفحة
أهداف الدرس
- شرح هوية الجلسة دون اعتبارها إذناً.
- اختيار سياسات الكوكيز والجلسة صراحة.
- تحديد مدة القفل وفحص عمر الحالة.
يشير معرف الجلسة لحالة ولا يمثل السياسة كاملة
تربط الجلسة معرفاً بحالة عبر معالج حفظ. يحمل المتصفح المعرف غالباً بكوكي لكن النقل والتخزين آليتان. لا يعني امتلاكه إذناً لكل فعل. تثبت المصادقة سياق حساب ويفحص التصريح الطلب بالقواعد الحالية. أبقِ القرار بالخادم وصغّر الحالة، ولا تضع المعرف بالعناوين والسجلات والصور والمخرجات؛ يستخدم الفصل حالة محلية مصطنعة فقط.
تعالج صفات الكوكيز وتثبيت الجلسة مخاطر مختلفة
اختر سياسة تلائم HTTPS ووصول البرنامج والسلوك العابر؛ تعالج Secure وHttpOnly وSameSite خصائص مختلفة. لا تستبدل SameSite كل CSRF ولا تمنع HttpOnly كل آثار الحقن. تساعد الصرامة في رفض معرف غير مهيأ مع المعالج الداعم. يحتاج التجديد عند تغير الامتياز عمراً يراعي الطلبات المتزامنة والتخزين؛ فلا تنسخ سطراً مدمراً دون فهم الفقد. راجع الإرشاد ونموذج التهديد قبل النشر.
اختبار التخزين دون كوكي أو جلسة تطبيق
ينشئ المثال مجلداً مؤقتاً خاصاً ويعطل الكوكي ويحدد معالج الملفات ومساره. يكتب عداداً مصطنعاً ويغلق ويعيد فتح الهوية المحلية ويقرأها ثم يحذف الملفات. لا يقرأ تخزين التطبيق أو مصادقة. يفحص هذا المعالج فقط لا HTTPS أو قبول الكوكي أو التخزين الموزع أو الدخول. وضح الافتراض ولا تعمم CLI كأمن جلسة.
<?php
declare(strict_types=1);
if (PHP_SAPI !== "cli") { throw new RuntimeException("CLI only"); }
$path = sys_get_temp_dir() . "/php-session-demo-" . bin2hex(random_bytes(6));
mkdir($path, 0700);
ini_set("session.save_handler", "files");
ini_set("session.save_path", $path);
ini_set("session.use_cookies", "0");
session_cache_limiter("");
try {
session_start();
$_SESSION["visits"] = 1;
session_write_close();
session_start();
$visits = $_SESSION["visits"];
session_destroy();
echo $visits, PHP_EOL;
} finally {
if (session_status() === PHP_SESSION_ACTIVE) { session_write_close(); }
foreach (glob($path . "/*") ?: [] as $file) { unlink($file); }
rmdir($path);
}
1
يثبت بقاء العداد بعد الإغلاق والفتح، ولا يفحص التسليم أو المصادقة.
تحرير الجلسة عند انتهاء عمل حالتها
تقفل بعض المعالجات الحالة أثناء الطلب فيحجب الطويل طلباً للجلسة نفسها. اقرأ أو حدّث ثم أغلق الكتابة عند انتهاء الحاجة، ولا تفترض حفظ تعديلات $_SESSION اللاحقة. ليست الجلسة قاعدة أعمال دائمة. يوضح النموذج لقطة محلية لا تتغير بنسخة العمل، أما القفل الحقيقي فيحتاج اختبار المعالج.
<?php
declare(strict_types=1);
$working = ["cartCount" => 1];
$savedSnapshot = $working;
$working["cartCount"] = 2;
echo $savedSnapshot["cartCount"], " ", $working["cartCount"], PHP_EOL;
1 2
يميز المحفوظ من التغيير اللاحق ولا يحاكي القفل أو الكوكي.
يحتاج الانتهاء والخروج دلالات صريحة
عرّف الخمول والعمر المطلق والامتياز والخروج والاستعادة بالمخاطر. يختلف إبطال حالة الخادم من انتهاء كوكي؛ فلا يلغي حذف كوكي كل جلسة. لا تخزن أسراراً وسجلات كاملة للسهولة. اختبر عمراً مصطنعاً بعملاء مستقلين وافحص غياب آثار المنتهي والمرفوض. وثّق الأصل والنطاق والمعالج والتزامن، ولا تضعف الصفات أو تستخدم جلسة حقيقية للنجاح.
الأخطاء الشائعة وإصلاحها
اعتبار حفظ CLI إثبات جلسة متصفح
- لماذا يحدث؟
- الخلط بين التخزين ونقل الكوكي.
- كيف تصلحه؟
- فحص التسليم والتخزين منفصلين.
- كيف تتجنب تكراره؟
- تحديد المعالج والبيئة والعمر المختبر.
حجب طلب طويل عمل الجلسة نفسها
- لماذا يحدث؟
- حفظ قفل المعالج أثناء عمل غير مرتبط.
- كيف تصلحه؟
- إغلاق الكتابة بعد تغييرات الحالة اللازمة.
- كيف تتجنب تكراره؟
- اختبار عملاء مصطنعين بمعالج مقصود.
اعتبار حقل جلسة إذناً دائماً
- لماذا يحدث؟
- استبدال الإذن الحالي بسياق مخزن.
- كيف تصلحه؟
- التصريح للفعل الحساس بالقواعد الحالية.
- كيف تتجنب تكراره؟
- مراجعة الامتياز والإبطال معاً.
اختبر فهمك
1. هل تلغي HttpOnly الحاجة لمنع XSS؟
اعرض الحل المشروح
لا؛ تقيد قراءة الكوكي لكن الحقن قد يفعل بسياق المستخدم أو يغير الصفحة. أبقِ الإخراج والسياسات وCSRF والإذن دفاعات منفصلة وافحص المهمة لا الصفة وحدها.
2. كيف تؤثر session_write_close في التعديل اللاحق؟
اعرض الحل المشروح
تكتب وتغلق الجلسة ولا تحفظ التعديلات العادية اللاحقة تلقائياً. أكمل المطلوب قبل الإغلاق ولا تدّعِ ديمومة اللاحق، وافحص المعالج بمعزل.
أهم ما تعلمته
- سياسة الكوكي والتخزين والهوية والإذن حدود مختلفة.
- امتلك عمر الجلسة وقلل قفلها وحالتها.