حيث يتم تخزين جلسات PHP. جلسات PHP تحت Scalpel
على الإنترنت، يمكنك العثور على الآلاف من البرامج التعليمية حول الدورات التي يحتاجون إليها وكيفية العمل معهم. ولكن لسوء الحظ، بعد قراءةها، لا تزال هناك العديد من الأسئلة. في رأيي، أسهل طريقة لمعرفة ذلك في كل شيء هو معرفة كيفية عمل الدورات من الداخل. أولئك. قم بفحص سجلات مشاركة المتصفح وخادم الويب، بالإضافة إلى معرفة البيانات التي يتم حفظها على جانب العميل وعلى جانب الخادم.
بعد ذلك، أصبحت لحظات كثيرة أكثر وضوحا، والآلية نفسها أكثر شفافية.
سيتم دراسة الجلسات في البرنامج النصي القياسي التالي:
يعمل على النحو التالي:
كتلة 1. تقوم ميزة Session_Start () بإنشاء جلسة جديدة أو تحميل القديم، باستخدام معرف جلسة PhsessID الفريدة.
كتلة 2. إذا تمكنت من استعادة الجلسة، تزداد قيمة _Session $ ["المشاهدات"] من قبل واحد. إذا لم يكن الأمر كذلك، تتم تهيئته من قبل واحد.
من الناحية النظرية، إذا تم تمكين دعم الطباخ في المتصفح، يجب أن تعمل الآلية وفي كل مرة يتم فيها تحديث الصفحة، ستزيد قيمة العداد من قبل واحد.
أول تحميل البرنامج النصي
طلب رؤوس
GET / HTTP / 1.1 المضيف: FiringRange.local - وكيل المستخدم: Mozilla / 5.0 (Windows NT 5.1؛ RV: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 قبول: نص / أتش تي أم أل، تطبيق / XHTML + XML، تطبيق / XML؛ Q \u003d 0.9، * / *؛ Q \u003d 0.8 قبول اللغة: ru-en، ru؛ q \u003d 0.8، en-us؛ q \u003d 0.5، en؛ q \u003d 0.3 قبول الترميز: gzip، dyplate قبول charset : Windows-1251، UTF-8؛ Q \u003d 0.7، *؛ Q \u003d 0.7 اتصال: التحكم في COUN-LIVE-SCATE: MAX-AGE \u003d 0الردود الإجابة
http / 1.1 200 موافق التاريخ: الخميس، 29 سبتمبر 2011 20:36:15 بتوقيت جرينتش الخادم: Apache / 2.2.13 (Win32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 Set-Cookie: phpsessid \u003d k33en6ccgcia7125mitj5te4u6؛ المسار \u003d / تنتهي صلاحيت: الخميس، 19 نوفمبر 1981 08:52:00 بتوقيت جرينتش Cache-Control: No-Store، لا ذاكرة التخزين المؤقت، يجب إعادة التدقيق، بعد الاختيار \u003d 0، تحقق مسبقا \u003d 0 Pragma: No-cache محتوى طول: 58 الحفاظ على قيد الحياة: مهلة \u003d 5، كحد أقصى \u003d 100 اتصال: الحفاظ على قيد الحياة المحتوى: Text / HTMLتعليق
في الطلب الأولي، لم يحدد المتصفح نفسه بأي طريقة، وبالتالي فإن الآلية جلسات PHP. ولدت معرف جلسة فريد جديد وقائد المتصفح لإنشاء حفنة يتم فيها تخزين هذا المعرف للغاية.
خادم جانبي
نتيجة البرنامج النصي على جانب الخادم، يتم إنشاء Sess_k33en6ccgcia7125mitj5te4u6 من المحتوى التالي:
جانب العميل
على جانب العميل، يتم إنشاء طباخ Phpsessid، حيث يتم تخزين قيمة المعرف الفريد للجلسة.
ملحوظة. ل إعدادات PHP. بشكل افتراضي، عمر طهي Phpsessid - حتى يتم إغلاق المتصفح. أولئك. بمجرد إغلاق المتصفح، سيتم حذف Cook، وسيتم فقد الجلسة وفقا لذلك. يمكن تغيير مدى حياة ملف تعريف الارتباط Phpsessid عن طريق تغيير قيمة Session.cookie_lifetime.
نتيجة عمل البرنامج النصي
التحميل الثاني سيناريو
طلب رؤوس
الحصول على / http / 1.1 المضيف: firingrange.local وكيل المستخدم: Mozilla / 5.0 (Windows NT 5.1؛ RV: 6.0.2) Gecko / 20100101 Firefox / 6.0.2 تقبل: النص / HTML، والتطبيق / XHTML + XML، والتطبيق / XML؛ Q \u003d 0.9، * / *؛ Q \u003d 0.8 قبول اللغة: ru-en، ru؛ q \u003d 0.8، en-us؛ q \u003d 0.5، en؛ q \u003d 0.3 قبول الترميز: Gzip، فرط قبول المجدد: Windows-1251، UTF-8؛ Q \u003d 0.7، *؛ Q \u003d 0.7 اتصال: كوكي الإبقاء على قيد الحياة: phpsessid \u003d k33en6ccgcia7125mitj5te4u6 cache-control: max-there \u003d 0الردود الإجابة
HTTP / 1.1 200 OK تاريخ: الخميس، 29 سبتمبر 2011 20:49:41 GMT Server: Apache / 2.2.13 (WIN32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 انتهاء الصلاحية: الخميس، 19 نوفمبر 1981 08:52:00 GMT Cache-Control-Control: No-Store، لا ذاكرة التخزين المؤقت، Revalidate، بعد الاختيار \u003d 0، تحقق مسبقا \u003d 0 Pragma: No-Cache Content-Light 5، كحد أقصى \u003d 100 اتصال: الحفاظ على قيد الحياة المحتوى: نص / أتش تي أم ألتعليق
يرسل المستعرض خادم ويب PHPSESSESSID باستخدام PHP تهيئة صفيف $ _sessions مع قيم من ملف Sess_k33en6ccgcia7125mitj5te4u6. وفقا لذلك، في Block 2 يعمل خارج فرع if (مباشرة).
خادم جانبي
نتيجة تشغيل البرنامج النصي، تتغير محتويات ملف Sess_K333N6CCCGCIA7125MitJ5T4U6:
جانب العميل
لا يتغير العميل على العميل.
نتيجة عمل البرنامج النصي
ماذا بعد؟
التنزيلات اللاحقة من الصفحة قبل إغلاق المتصفح ستعمل عن طريق القياس مع كيفية عمل التحميل الثاني من البرنامج النصي.
لأن كان عمر طبخ يقتصر على الدورة الحالية للمتصفح، ثم بعد إغلاقه، سيتم فقد معرف الجلسة الفريد وعند إعادة تشغيل العملية سيستمر في واحدة جديدة.
ومع ذلك، يمكنك العودة إلى الجلسة المحفوظة، إذا قمت بتحديد PhsessID بشكل صريح كمعلمة البرنامج النصي:
العودة إلى الجلسة مشروطة تماما، ل نتيجة تشغيل البرنامج النصي في هذه الحالة، لا يتم إنشاء كوك. رؤوس استجابة الخادم:
HTTP / 1.1 200 OK تاريخ: الخميس، 29 سبتمبر 2011 21:01:52 GMT Server: Apache / 2.2.13 (WIN32) PHP / 5.2.10 X-Powered-by: PHP / 5.2.10 انتهاء الصلاحية: الخميس، 19 نوفمبر 1981 08:52:00 GMT Cache-Control-Control: No-Store، لا ذاكرة التخزين المؤقت، Revalidate، بعد الاختيار \u003d 0، تحقق مسبقا \u003d 0 Pragma: No-Cache Content-Light 5، كحد أقصى \u003d 100 اتصال: الحفاظ على قيد الحياة المحتوى: نص / أتش تي أم أل
أولئك. للحفاظ على العمل، من خلال هذه الجلسة إلى جميع الروابط التي تعزى إلى؟ pppsessid \u003d k33en6ccgcia7125mitj5te4u6.
ملحوظة. يمكنك تحديد PHP بحيث يتم نقل معرف الجلسة الفريد فقط من خلال الطهي. للقيام بذلك، قم بتثبيت Session.use_only_cookies في القيمة 1. في هذه الحالة، فإن الخدعة، التي تظهر أعلاه، لن تمر.
إذا تم تعطيل ملفات تعريف الارتباط في المتصفح، فيمكنك نقل معرف الجلسة عبر المعلمات، كما فعلنا أعلاه. علاوة على ذلك، هناك آلية في PHP التي ستضيف المعلمة المرغوبة إلى الرابط وإضافة حقول مخفية إلى النموذج. مبدأ العملية هو نفسه تماما كما هو الحال مع ملفات تعريف الارتباط، لذلك لن نتفكك هذه الحالة بشكل منفصل.
استبيان صغير (أسئلة وأجوبة)
أين يتم تخزين بيانات الجلسة جسديا؟
يتم تخزين بيانات الجلسة على الخادم. بشكل افتراضي، يتم تسجيلها في الملفات، ولكن يمكنك تحديد آلية تخزين بيانات الجلسة الخاصة بك (على سبيل المثال، باستخدام قاعدة بيانات). إذا كنت تريد التفاصيل، راجع ميزة Session_set_save_handler.
من يولد معرف جلسة فريد؟
يقوم معرف جلسة فريد (Phpsessid) بإنشاء خادم.
هل من الممكن كتابة آلية الخاصة بك من جلسات؟
نعم، من الممكن تماما. كما ترون، لا تستخدم PHP أي شيء خارق للطبيعة - يتم حفظ المعرف بين الطلبات مع طباخ، يتم تخزين بيانات الجلسات في الملفات الموجودة على الخادم.
على سبيل المثال، فإن آلية العمل الخاصة بها مع الجلسات هي في Codeigniter الإطار الشعبي.
ما مدى أمان آلية الدورات؟
يتم تحديد الجلسة فقط بمساعدة معرف جلسة فريد، لذلك في الحالة العامة، يكون المهاجم يكفي لسرقةه لإرباك الخادم. خذ البرنامج النصي الذي استخدمناه أعلاه. إذا كان الاستئناف له من IP آخر (فيما يتعلق بالجلسة التي قمت بإنشائها)، ولكن سيتم نقل PhsessID نفس الشيء، ثم سيتم استعادة الجلسة بنجاح وسيزداد العداد من القيمة المحفوظة السابقة.
تزود دفاع إضافي سيكون لديك لك. على سبيل المثال:
- يمكنك حفظ في بيانات جلسة IP وعميل وكيل المستخدم (سيتم تخزينها على جانب الخادم)، ثم في كل مقبض، من الضروري التحقق من أن القيم الحالية تزامضة مع المحفوظة. في هذه الحالة، يجب عليك البحث عن حل وسط بين أمن المستخدم وراحة المستخدم.
على سبيل المثال، إذا كان لدى المستخدم IP ديناميكي وكنت تستخدم الجلسة للحفاظ على إذن، ولكن في الوقت نفسه تحقق من التنقل في IP، ثم مع كل تغيير عنوان، سيتعين على المستخدم إعادة إدخال اسم المستخدم وكلمة المرور.
وبالمثل، قد تختلف سلسلة وكيل المستخدم عند تحديث إصدار المتصفح أو عند تثبيت بعض الإضافات.
- تتمثل إحدى آليات حماية الدورة الموصى بها في إعادة إنشاء معرف في كل مرة يناشد البرنامج النصي (انظر وظيفة session_regenerate_id). عرض البرنامج النصي وخوارزمية العمل في القسم يمكن أن يكون أدناه.
ملحوظة.إذا كنت تعتقد أن النقاش على الموقع الرسمي، فعندئذ عند إعادة إنشاء معرف، يمكن أن تنشأ المشكلات بالوصول الموازي إلى البيانات.
جلسات العمل مع إعادة توليد المعرف في السياق
النصي
// كتلة 1.
session_start ()؛
إذا(isset.($ _session ["بدأ"]))
session_regenerate_id ()؛
آخر.
$ _session ["بدأ"] \u003d حقيقي.;
// كتلة 2.
إذا(isset.($ _session ["وجهات النظر"]))
$ _session ["وجهات النظر"] ++؛
آخر.
$ _session ["وجهات النظر"] \u003d 1؛
// كتلة 3.
صدى صوت."
<
body>
عدد المشاهدات: ". $ _session [" وجهات النظر "]."