لائحة الطعام
مجاني
تحقق في
الرئيسية  /  الأنترنيت / جلسة. جلسات المراقبة، كلمات مرور التطبيق وتأكيد الدخول على الجلسة النشطة فيسبوك

جلسة. جلسات المراقبة، كلمات مرور التطبيق وتأكيد الدخول على الجلسة النشطة فيسبوك

لا يدعم خادم الويب اتصالا دائما مع العميل، ويتم معالجة كل طلب جديدا، دون أي اتصال بالآخر.
أي أنه من المستحيل تتبع الطلبات من نفس الزائر أو حفظ المتغيرات لذلك بين المشاهدة الصفحات الفرديةوبعد هنا، لحل هاتين المهامتين، تم اختراع جلسات.
في الواقع، فإن الدورة، إذا كانت هذه آلية تتيح لك بتحديد المتصفح وإنشاء ملف لهذه المستعرض بشكل لا لبس فيه بشكل لا لبس فيه وإنشاء ملف لهذا المستعرض على الخادم الذي يتم تخزين متغيرات الجلسة.

لن أرسم بالتفصيل في مثل هذه الآلية. هذه هي حالة المسافر مثل عربة التسوق في المتجر الإلكتروني، والترخيص، وكذلك عدم وجود مشاكل تافهة تماما، مثل حماية الأجزاء التفاعلية من الموقع من البريد المزعج.

من حيث المبدأ، من السهل جدا أن نجعل التناظرية الخاصة بك من جلساتك، ليست وظيفية كما بنيت في PHP، ولكن مماثلة في جوهرها. على ملفات تعريف الارتباط وقاعدة البيانات.
عندما يطلب منك البرنامج النصي، نرى ما إذا كان الطهي جاء باسم معين. إذا لم تكن هناك ملفات تعريف الارتباط، فقم بوضعها وكتابة سطر جديد إلى قاعدة البيانات مع بيانات المستخدم. إذا كان هناك طباخ، نقرأ البيانات من قاعدة البيانات. نقوم بإزالة السجلات القديمة من القاعدة من القاعدة وهنا نحن مستعدون لآلية الجلسة. إنه سهل تماما. ولكن هناك بعض الفروق الدقيقة التي تفضل استخدام الآلية المضمنة للجلسات.

إذا تم تمكين الأول فقط، فوعد عند بدء الجلسة (في كل مرة تقوم فيها بالاتصال session_start ()) تم تثبيت كوك للعميل. المتصفح بشكل صحيح في كل طلب إرجاع الطهي هذا و PHP لديه معرف جلسة. تبدأ المشاكل إذا لم يعد متصفح الطهي. في هذه الحالة، دون تلقي ملفات تعريف الارتباط مع معرف، سيبدأ PHP جلسة جديدة طوال الوقت، ولن تعمل الآلية.

إذا تم تضمين الثانية فقط، فلن يتم عرض الطهي. وهذا يحدث، بالنسبة لما، في الواقع، في الواقع، يستحق استخدام آلية الجلسة المدمجة. بعد البرنامج النصي، تقوم بعملها، وتشكل الصفحة بالكامل، وجهات النظر PHP كلها وتضيف إلى كل رابط وإلى كل نموذج لإرسال معرف الجلسة. تبدو هكذا:
فهرس تحول الى
فهرس
والنماذج إضافة حقل مخفي

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

من الناحية النظرية، في جلساتنا محلية الصنع الخاصة بنا على ملفات تعريف الارتباط وقاعدة البيانات معك، يمكنك إسنادها إلى جميع المراجع إلى المعرف - ثم ستعمل جلساتنا الخاصة بشكل مستقل عن الطهي. ولكن، ترى - أكثر متعة عندما يقوم شخص آخر بهذا العمل؟ ؛-)

الافتراضي ب الإصدارات الأخيرة PHP يتضمن كلا الخيارين. كيف تعود PHP في هذه الحالة؟ يتم عرض كوك دائما. وروابط الارتباط فقط فقط إذا لم تجد RNR طباخا مع معرف جلسة. عندما يتعلق الأمر المستخدم في الوقت القصير لهذه الجلسة إلى الموقع، فإنه مصنوع من الطهي، ويتم تكمل الروابط. في المرة القادمة التي تطلب فيها، إذا كانت ملفات تعريف الارتباط مدعومة، فإن PHP يرى طباخا وتتوقف عن تكمل الروابط. إذا لم تنجح ملفات تعريف الارتباط، فستستمر PHP في إضافة معرف الروابط بشكل صحيح، ولا تضيع الجلسة.
ستشهد المستخدمون الذين لديهم ملفات تعريف الارتباط رابطا طويلا من المعرف مرة واحدة فقط.

فوه. مع نقل المعرف النهائي.
الآن يبقى لربط ملف مع البيانات على جانب الخادم.
PHP سوف تفعل ذلك بالنسبة لنا. فقط اكتب بما فيه الكفاية
session_start ()؛
$ _session ["اختبار"] \u003d "Hello World!" ؛

وسوف تكتب PHP إلى ملف مرتبط بهذه الجلسة، متغير الاختبار.
هنا ملاحظة مهمة للغاية.
مجموعة مصفوفة $ _session. - خاص.
في الواقع، في الواقع، هناك متغيرات نذهب لتسهيل الوصول إليها في البرامج النصية المختلفة.
لوضع متغير في الجلسة، يكفي تعيينه عنصر صفيف $ _Session.
للحصول على قيمتها - يكفي أن تنطبق على نفس العنصر. مثال سيكون أقل قليلا.

القمامة القمامة - إزالة عفا عليها الزمن ملفات php تشارك أيضا في نفسه. كما هو الحال مع ترميز البيانات ومجموعة من أي أشياء ضرورية أخرى. نتيجة لهذا الاهتمام، تبين أن العمل مع جلسات بسيطة للغاية.
لذلك نحن، في الواقع، تأتي إلى مثال عمل الجلسات.
المثال صغير جدا:
session_start ()؛

صدى صوت. "قمت بتحديث هذه الصفحة"وبعد $ _session ["عداد"] ++. "مرة واحدة."؛
صدى صوت "
تحديث "؛
?>

نتحقق مما إذا كان لدينا متغير عداد في الجلسة، إن لم يكن، ثم ننشئها بقيمة 0، ثم نستمد قيمتها وزيادة الوحدة. يتم تسجيل القيمة الموسعة في الجلسة، وفي المرة التالية التي تسمونها إلى البرنامج النصي، سيكون المتغير 1، وهلم جرا.
كل شيء بسيط جدا.

من أجل الوصول إلى جلسة متغيرة على أي صفحات من الموقع، تحتاج إلى كتابة موقع واحد فقط (!) في بداية كل ملف نحتاج فيه دورات:
session_start ()؛
والوصول إلى مزيد من عناصر صفيف $ _Session. على سبيل المثال، سيظهر التحقق من التفويض شيئا مثل هذا:
session_start ()؛
إذا ($ _session ["معتمد"]<> 1 ) {
رأس ("الموقع: / auth.php")؛
خروج؛
}

إزالة المتغيرات من الجلسة.
إذا كان لديك Register_Globals \u003d OFF، فيمكنك الكتابة
uNSET (جلسة $ _ ["فار"]؛
إذا لم يكن ثم مجاور من الضروري أن أكتب معها
session_unregister ("فار")؛

الأخطاء الأكثر شيوعا التي تعطي PRP عند محاولة العمل مع جلسات هي:
اثنين منهم،
تحذير: لا يمكن لدورة ملف تعريف الارتباط - الرؤوس المرسلة بالفعل
تحذير: لا يمكن لدورة جلسة التخزين المؤقت مخبأ - رؤوس أرسلت بالفعل

الناجمة عن نفس السبب، يتم وصف الحل في هذه الفاك
ثالث
تحذير: فشل Open (/ TMP \\ Sess_SID، O_RDWR): لا يوجد مثل هذا الملف أو الدليل (2) في full_script_path على رقم السطر (في وقت سابق بدا تحذير: فشل في كتابة بيانات الجلسة (الملفات). يرجى التحقق من أن الإعداد الحالي لل Session.Save_Path صحيح (/ TMP)),
إذا قمت بترجمتها من اللغة الإنجليزية، إلا أنه يشرح بالتفصيل المشكلة: المسار المحدد في PHP.INI غير متاح إلى الدليل الذي تتم فيه كتابة ملفات الجلسة. هذا الخطأ يعمل على إصلاح أسهل طريقة. ما عليك سوى تسجيل الدليل الموجود وهو متاح للتسجيل، على سبيل المثال،
session.Save_Path \u003d C: \\ Windows \\ Temp
ولا تنسى إعادة تشغيل Apache بعد ذلك.

كما اتضح، فإن مخابرات الإنسان لا يوجد لديه حدود، وبالتالي يجب أن توضح:
ستؤدي رسالة خطأ ثالثة (من المستحيل العثور على دليل) حتما إلى ظهور الاثنين الأولين، لأن رسالة الخطأ هي الإخراج إلى المتصفح وبعد ذلك من المستحيل استخدام الرؤوس. لذلك، لا تتعجل للبحث عن استنتاج سابق لأوانه، وأول مرة في الكتابة بالطريقة الصحيحة!

مشكلة الانتشار التالية عند العمل مع جلسات هي سجل إرث كبير_globals. لا تعطي Script متغيرات الأسماء التي تتطابق مع فهارس صفيف $ _session!
عند التسجيل_لوبال \u003d ON، ستطرح القيم بعضها البعض، وأنت مرتبك.
وعندما يظهر Register_Globals \u003d OFF خطأ آخر: "تعتمد البرنامج النصي الخاص بك على تأثير جانبي جلسة موجود حتى 4.2.2.3."، في حالة وجود جلسة متغيرة في البرنامج النصي، والمتغير العالمي مع نفس الاسم. للتخلص منه، يجب عليك دائما تهيئة المتغيرات قبل الاستخدام (أو على الأقل تحقق من وجود) وليس لإعطاء أسماء متغيرة عالمية تتطابق مع فهارس صفيف $ _SESSION.

إذا لم تنجح، ولكن لا يتم عرض أي رسائل، ثم أضف سطرين إلى بداية البرنامج النصي مسؤولا عن إخراج جميع الأخطاء على الشاشة - فمن الممكن تماما أن هناك أخطاء، لكنك لا تفعل ذلك فقط ر ترى لهم.
iNI_SET ("عرض_ الترورز"، 1)؛
error_reporting (e_all)؛

أو انظر الأخطاء في error_log. بشكل عام، فإن موضوع عرض رسائل الخطأ هو خارج نطاق هذه المقالة، لذلك فقط تأكد على الأقل يمكنك رؤيتها. يمكن العثور على تحول طفيف حول البحث عن الأخطاء في هذا القسم.

إذا كنت متأكدا من عدم وجود أخطاء، ولكن المثال أعلاه لا يعمل على أي حال، فمن الممكن أن يتم تضمين PHP في PCL تمر عبر UL، وملفات تعريف الارتباط لسبب ما لا تعمل.
انظر ما لديك مع ملفات تعريف الارتباط.
بشكل عام، إذا كنت "لا تعمل" جلسات، فحاول أولا نقل معرف الجلسة بيديك، وهذا هو، وصلة وصلة وسمة لمعرفها:
session_start ()؛
إذا (! ISSET (دورة $ _ ["مكافحة"])) $ _session ["عداد"] \u003d 0؛
صدى صوت. "قمت بتحديث هذه الصفحة"وبعد $ _session ["عداد"] ++. "مرة واحدة.

تحديث "؛
?>

يجب التحقق من عدم تمكين توجيه Session.use_only_cookies، والذي يحظر PHP قبول معرف الجلسة إذا تم إرساله عبر عنوان URL

إذا لم يكسب هذا المثال، فإن المشكلة هي إما في Banal typos. (نصف "مشاكل" مع جلسات تأتي من اسم متغير مكتوب بشكل غير صحيح) أو في أيضا نسخة قديمة PHP: دعم جلسات ظهر في الإصدار 4.0، ومجموعة $ _session. - في 4.1 (قبل استخدامها $ http_session_vars.).
إذا كان يعمل، فإن المشكلة في ملفات تعريف الارتباط. تتبع - ما هي المجموعة التي يتم بها وضعها من قبل الخادم إلى المتصفح، سواء كان المتصفح إرجاعه. البحث مفيد للغاية، والنظر في عرض تبادل رؤوس HTTP بين المتصفح والخادم.
يتجاوز تفسير مبدأ عمل الطباخ نطاق هذا ونص كبير جدا، ولكن على الأقل تأكد من أن خادم الطهي مع إرسال المعرف يرسل، وعودة المتصفح. وفي الوقت نفسه يتزامن معرفات مع بعضها البعض \u003d)
تثبيت ملفات تعريف الارتباط يجب أن تبدو
تعيين ملف تعريف الارتباط: phpsessid \u003d prlgdfbvlg5fbsbshch6hj0cq6؛
أو كيف
تعيين ملف تعريف الارتباط: phpsessid \u003d prlgdfbvlg5fbsbshch6hj0cq6؛ المسار \u003d /
(إذا طلبت برنامج نصي ليس من كتالوج الجذر)
يجب أن تبدو استجابة الخادم
ملف تعريف الارتباط: phpsessid \u003d prlgdfbvlg5fbsbshch6hj0cq6
أو
ملف تعريف الارتباط: phpsessid \u003d prlgdfbvlg5fbsbshch6hj0cq6؛ ب \u003d ب.
إذا قام المتصفح بإرجاع ملفات تعريف الارتباط الأخرى، باستثناء معرف الجلسة.

إذا لم يعود متصفح Bouquet - تحقق مما إذا كانت ملفات تعريف الارتباط تعمل على الإطلاق.
تأكد من أن المجال الذي استطعت به اسم طبيعي (يكون هناك نقطة واحدة على الأقل ولا يحتوي على أحرف محظورة، مثل الأسطوانة) وتنظيف ذاكرة التخزين المؤقت للمتصفح - هذه هي سببان رئيسيان لملفات تعريف الارتباط قد لا تعمل وبعد

إذا كان مثال يعمل من هنا، فإن الكود الخاص بك ليس كذلك، فمن الواضح أن المشكلة ليست في جلسات، ولكن في الخوارزمية. ابحث عن المكان الذي فقدته المتغير، على الخطوات التي تحمل مثالا من هنا، قم بتصحيح البرنامج النصي الخاص بك.

قد تحدث مشكلة أخرى إذا كنت تستخدم إعادة التوجيه عبر الرأس أو التنقل باستخدام JavaScript.
والحقيقة هي أن RNR يضيف تلقائيا معرف الجلسة فقط إلى مراجع الأنواع ولكن لا يجعلها للرأس، جافا سكريبت، علامات التعريف.
لذلك، تحتاج إلى إضافة المعرف بيديك، على سبيل المثال، كما يلي:
رأس ("الموقع: /script.php؟" Session_name (). "\u003d". Session_id ())؛

أيضا، نادرة جدا، وغير مفهومة تماما، من حيث الناشئة، المشكلة هي أن إعداد Session.Save_Handler لديه قيمة أخرى غير الملفات. إذا لم يكن الأمر صحيحا جدا.

أمان
جلسات السلامة - الموضوع واسع النطاق. لذلك، سوف أتوقف عند عدة نقاط رئيسية.
الأكثر استضافارا - وليس نقل المعرف من خلال خط عنوانوبعد هذا مكتوب حتى في PHP.INI، لكنه يحد من وظائف الجلسات. إذا قررت اتباع هذه النصيحة، ما عدا Session.use_Trans_SID \u003d 0 لا تنسى الجلسة.use_only_cookies \u003d 1
ينصح بربط الجلسة على عنوان IP: بهذه الطريقة، إذا سرق المعرف، فلن يكون الشرير غير قادر على استخدامها في معظم الحالات.
يوصى باستخدام Session.Save_Path التوجيه، والتي لتحديد الدليل الخاص بك لحفظ ملفات الجلسة. هذا أكثر أمانا من عندما يتم تخزينها في الدليل المؤقت العام للخادم الافتراضي.

معلومة اضافية:

  • بالإضافة إلى الطهي، ترسل آلية الجلسة أيضا الرؤوس التي تحظر الصفحات التخزين المؤقتة (نفس محدد ذاكرة التخزين المؤقت). بالنسبة ل HTML هو الصحيح والضروري. ولكن عندما تحاول إعطاء برنامج نصي يتحقق من إذن، أرسل الملف، ثم يرفض برنامج Internet Explorer تنزيله. إنه بسبب هذا الرأس. يتصل
    session_cache_limiter ("خاص")؛
    قبل بدء الجلسة يجب أن يحل المشكلة.
  • كما يبدو غريبا، ولكن في الصفيف $ _session. لا يمكن استخدام الفهارس الرقمية - $ _session [1]، $ _session ["10"] - سوف لا تعمل التوصلات.
  • في مكان ما بين الإصدارات 4.2 و 5.0، كان من المستحيل تثبيت Session.use_trans_sid باستخدام ini_set () وبعد بدءا من 5.0، يمكنك بالفعل مرة أخرى.
  • قبل الإصدار 4.3.3 طبخ php. أرسلت حفنة فقط إذا كانت الجلسة تبدأ في الاستعلام، لم يكن هناك معرف. الآن يتم إرسال الطباخ في كل مرة اتصل بها. session_start ()

    مثال على إذن باستخدام جلسات
    سنوضح كل شيء منتخب من قبل مثال صغير:
    إنشاء ملف Auth.php:
    إذا (ISSET ($ _ Post ["Auth_Name"]))
    {
    $ sql \u003d. "حدد * من المستخدمين حيث الاسم \u003d؟ S";
    $ الصف \u003d $ db -\u003e getrow ($ sql، $ _post ["auth_name"])؛
    إذا كان ($ Row && password_verify ($ _Post ["Auth_Post"]، $ TWR ["PASS"])) (
    $ _session ["user_id"] \u003d $ الصف ["معرف"]؛
    }
    رأس ("الموقع: http: //". $ _server ["http_host"]. $ _server ["presert_uri"])؛
    خروج؛
    }

    إذا (ISSET ($ _ احصل على ["الإجراء"]) و $ _GET ["الإجراء"] \u003d\u003d "تسجيل الخروج") (
    session_start ()؛
    session_destroy ()؛
    رأس ("الموقع: http: //". $ _server ["http_host"]. "/")؛
    خروج؛
    }

    إذا (! ISSET (جلسة _ $ _ ["user_id"]) (
    ?>








    خروج؛
    }

    الآن يكفي الكتابة في جميع البرامج النصية المحمية
    تتطلب "auth.php"؛
    في هذا المثال، من المفترض أن تكون الجلسة قد بدأت بالفعل ويتم إنشاء الاتصال مع قاعدة البيانات باستخدام فئة للعمل الآمن والملائم مع MySQL. يفترض أيضا أن كلمة المرور يتم حشدها باستخدام الوظيفة الموصى بها من Password_hash.
    مثال على ملف محمي:

    session_start ()؛
    تشمل "safemysql.class.php"؛
    DB $ \u003d SAFEMYSQL جديد (["DB" \u003d\u003e "اختبار"])؛
    تشمل "auth.php"؛
    ?>
    سر.

    تسجيل خروج.

    ops! روابط مفيدة جدا:
    http://www.php.net/manual/ru/ref.session.php هو أحدث ومعلومات أحدث معلومات عن دعم الجلسات في PHP في الوثائق الرسمية، بالإضافة إلى العديد من تعليقات المستخدمين. يوصى بشدة بالقراءة.
    http://phpclub.ru/manrus/f/ref.session.html هو ترجمة عفا عليها الزمن للغاية لهذا الفصل إلى الروسية، من الوثائق في ترجمة ألكساندر بيراميدين.
    http://phpclub.ru/detail/article/sessions.
    مقال بعنوان مثير للشفقة "صحيح على جلسات". أوراق الانطباع المزدوج. في البداية، يتحدث صاحب البلاغ بمعقدة بآلية الجلسات، لكن الأساليب التي يقترحها بنهاية المقالة موضة تماما.

    chrestoment artical dmitry borodin من الموقع
    http://php.spb.ru/ أمر عاجل غير مستحسن.
    الرجال، هي قديمة بشكل رهيب. لا يكفي أن هناك عدم دقة فعلية حقيقية فيها، لذلك مع جلسات في PHP لفترة طويلة لا تعمل ببساطة.
    شكرا جزيلا بالنسبة لها، لقد كانت المادة الأولى على الدورات الروسية، وأنا نفسي درست عليها، ولكن الآن من الضروري إرسالها إلى راحة جيدة.
    أيضا، عفا عليها الزمن، والعديد من المواد الأخرى المستلقية على الإنترنت وغير متجدد منذ سنوات.

  • دعونا نلقي نظرة على مثل هذا الشيء كجلسة (جلسة HTTP، جلسة). أو بشكل مختلف، جلسة مستخدم. لماذا من المهم أن نفهم آلية عمل الجلسات. ودعونا نرى كيف يمكنك العمل مع دول الدورة على منصة ASP.NET.

    قبل أن نقدم تعريف مصطلح "الجلسة"، دعونا نلقي نظرة على ما قبل التاريخ قليلا، لماذا الحاجة إلى جلسات، والنظر في ميزة واحدة من بروتوكول HTTP.

    واحدة من السمات الرئيسية لبروتوكول HTTP هي أنها لا تلزم الخادم بحفظ معلومات العميل بين الطلبات، أي تحديد العميل. هذا هو ما يسمى بروتوكول عديمي الجنسية. تنتهي العلاقة بين العميل والخادم بمجرد اكتمال معالجة الاستعلام الحالي. يهدف كل طلب جديد إلى الخادم إلى نوع فريد من نوعه ومستقلة تماما، حتى لو تم إرساله مرة أخرى من نفس المصدر.

    ماذا لو تركت الطبيعة القانونية بروتوكول HTTP ولا تحدد المستخدم؟ بدون دور جلسة، يمكنك القيام به بسهولة، إذا تم تمثيل موقعك بواسطة معلومات ثابتة (صوفية)، على سبيل المثال، مادة إخبارية تتكون من نص وصور. في مثل هذا السياق، من اختياريا تماما لربط العديد من الطلبات مع مستخدم واحد. بعد كل شيء، لن يتغير محتوى المقال بأي شكل من الأشكال، سواء كانت 10 طلبات من جهاز واحد أو 10 طلب من أشخاص مختلفين من أجهزة مختلفة.

    ولكن بمجرد سنقوم بنقل المعلومات الشخصية إلى الخادم، نحتاج إلى جعل هذا الخادم يربط جميع طلباتنا منا، وفي المستقبل حدد جميع الطلبات منا. إذا لم يتم ذلك، فمن بين كل طلب جديد، فسوف يجبرنا على إعادة إرسال البيانات الشخصية اللازمة. على سبيل المثال، تسجيل الدخول للدخول المنطقة الشخصية على الموقع، أو هذه المعلومات كاسم، عنوان الشحن، عند إجراء عملية شراء في المتجر عبر الإنترنت.

    هذا فقط في مثل هذه الحالات عندما تحتاج إلى تخصيص الطلبات من عميل واحد، وسوف نستخدم جلسات.

    جلسة (جلسة) - هذا هو بعض الطول في الوقت المناسب، والتي يمكن أن يحدد فيها تطبيق الويب جميع الطلبات من عميل واحد.

    عندما يقوم العميل أولا بإرسال البيانات الشخصية في الاستعلام، يتم إنشاء جلسة جديدة على الخادم لهذا العميل. أثناء مدى الحياة من الجلسة، سيتم التعرف على جميع طلبات هذا العميل بشكل لا لبس فيه. بعد هذا الوقت، سيتم فقد الاتصالات مع العميل، وسيتم معالجة الطلب التالي منه على أنه فريد من نوعه، بأي حال من الأحوال المرتبطة بالآخر.

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

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

    1. الحقول المخفية على أتش تي أم أل (حقول النماذج المخفية)
    2. ملفات تعريف الارتباط (ملفات تعريف الارتباط)
    3. الجلسة (الجلسة، دولة الدورة)

    دعونا نحاول تنفيذها باستخدام منصة ASP.NET. دعنا ننظر لفترة وجيزة في أول آليتين، وسيتم إيلاء اهتمام خاص للثالث، باعتباره أكثر موثوقية ومريحة وآمنة.

    الحقول المخفية على أتش تي أم أل (حقول النماذج المخفية)

    جوهر هذا النهج هو أننا نقدم الملاحة من خلال الموقع باستخدام نموذج HTML القياسي. ومع كل طلب التالي، نحتفظ بالبيانات من السابق في الحقول المخفية في النموذج. على سبيل المثال:

    using (html.beginform ("Forms2"، "Home"، FormMethod.post)) (

    أطباق الطلب

    }

    ActionResult Scors2 () () (Viewbag.username \u003d request.form [اسم المستخدم "]؛ عرض العائد ()؛)

    usinging (html.beginform ("forms3"، "home"، formmethod.post) (

    @ ($ "مساء الخير (Viewbag.Username)! ماذا ستطلب؟")

    }

    في هذا المثال، نحصل على اسم المستخدم في نموذج HTML الأول. التالي في وحدة التحكم في الطريقة Forms2 () نقوم بإزالة هذه القيمة من المجموعة استمارة ونقل إلى التمثيل من خلال الكائن حقيبة عرض.وبعد في هذا الرأي، يتم إنشاء التعليمات البرمجية صيغة جديدة وفي المجال المخفي، يتم حفظ اسم المستخدم. وبالتالي، سيتم تمرير قيمة اسم المستخدم على الشكل الثالث مع للمزيد من المعلومات - القيمة الميدانية المسماة "اسم الطعام"وبعد إلخ.

    دعونا ننظر في ميزات هذا النهج. لا توجد مزايا عمليا، إلا أن هذه التقنية يمكن تنفيذها بسرعة كبيرة. ولكن مرة أخرى، يمكن أيضا تنفيذ الأساليب الأخرى بسرعة كبيرة. ولكن هناك ناقص، وأساسية للغاية:


    ملفات تعريف الارتباط (ملفات تعريف الارتباط)

    ActionSresult Cookies2 () Cookies2 () (ملف تعريف الارتباط httpcookie \u003d httpcookie جديد ("اسم المستخدم"، httputility.urlencode (طلب "اسم المستخدم"])؛ cookie.expires \u003d datetime.utcnow.adhours (1)؛ الاستجابة. ملف تعريف الارتباط)؛ عرض العودة ()؛)

    using (html.beginform ("ملفات تعريف الارتباط 3"، "Home"، FormMethod.post)) (

    @ ($ "مساء الخير (HTTPutility.URLDECODE (طلب. Cookies [اسم المستخدم"]؟ القيمة))! ماذا ستطلب؟ ")

    }

    في هذا النهج نحن لا نقوم بتخزين بيانات الجلسة مباشرة على النموذج، بدلا من استخدام عمل المصنف القياسي بين العميل والخادم. في ملفات تعريف الارتباط وتخزين جميع بيانات المستخدم.

    عند تحديد هذا النهج، مرة أخرى، تظل مشكلة الأمان الرئيسية أمان بياناتنا، والتي ننتقلها إلى الخادم - إنها سهلة الاستبدال أو سرقةها، وهي تكمن في افتح الفيديووبعد أيضا، إذا تم قطع اتصال إعدادات خصوصية مستعرض العميل من المواقع من المواقع، فلن يعمل هذا الخيار على الإطلاق.

    وبالتالي، يوصى بشدة بنقل البيانات المهمة والسراوية إلى أول طريقتين، مثل تسجيلات الدخول أو كلمات المرور وأرقام البطاقات والحسابات وبيانات جواز السفر ومكان الإقامة، إلخ.

    آلية إدارة جلسة الخادم (الجلسة، الدورة)

    سنقوم بتحليل كيفية عمل آلية الدورة من جانب الخادم ومن العميل.

    ل الإعدادات القياسية يتم استخدام عمليات حالة الجلسة لتتبع سلسلة من الاستفسارات من عميل واحد من قبل ما يسمى. ملف تعريف الارتباط الجلسة. الخوارزمية هي ما يلي:

    1. تماما لكل طلب جديد إلى الخادم (بغض النظر، عملاء مختلفون أو واحد) asp.net ينشئ معرف جلسة فريد.
      معرف الجلسة هو رقم تم إنشاؤه عشوائيا مشفرة مع خوارزمية خاصة في سلسلة من طول 24 حرفا. تتكون السلسلة من الحرفية من A إلى Z في الحالة الصغيرة، بالإضافة إلى أرقام من 0 إلى 5. مثال على المعرف - Hjnyuijl1pam3vox2h5i41in
    2. إذا لم يتم حفظ بيانات العميل أثناء الطلب الحالي على مزيد من العمل معه، فإن عمر هذا العميل ينتهي (في الواقع دون بدء). في الوقت نفسه، يصبح معرف الجلسة الذي تم إنشاؤه مسبقا غير صالح (لأنه لم يتم استخدامه). استجابة لمثل هذا الطلب، لا يحصل العميل على أي شيء لربطه بجلسة جديدة.
    3. إذا تم حفظ بيانات العميل (على سبيل المثال، اسم، عنوان التسليم للبضائع) على الخادم، يربط ASP.NET البيانات المحفوظة من معرف الجلسة التي تم إنشاؤها مسبقا. فيما يلي ملف تعريف الارتباط بالجلسة الخاصة، ويتم تسجيل هذا المعرف أيضا فيه. تتم إضافة ملف تعريف الارتباط هذا استجابة للطلب وحفظه في متصفح العميل. وبالتالي، يتم إنشاء اتصال العميل ومعلوماتها الشخصية على الخادم. جلسة جديدة ل هذا العميل خلقت.
    4. في كل مرة الاستعلام التالي، يرسل العميل معرف جلسة شخصية إلى الخادم من خلال ملفات تعريف الارتباط. يقارن الخادم المعرفات و "تعترف" العميل كجزء من الجلسة الحالية.
    5. طالما أن العميل ينقل مفتاحه الشخصي، فإن الجلسة تعتبر نشطة. يمكن أن تنتهي الجلسة لأسباب مختلفة، على سبيل المثال، يدويا على جانب الخادم أو بعد وقت محدد (مهلة).

    من النظرية، ننتقل إلى الممارسة. دعونا نبرم هذه الخوارزمية ونرى كيف يتم تنفيذها. للقيام بذلك، استخدم فئة HttpsessionSession الخاصة. عند العمل في وحدة التحكم، يمكنك استخدام خاصية HttpContext.session. العمل مع الجلسة بسيطة للغاية، مثل مع أي اسم valvaluecollection:

    جلسة [اسم المستخدم "] \u003d الطلب .form [اسم المستخدم"]؛ BOOL ISSELENEW \u003d جلسة. سلسلة السلسلة \u003d الجلسة

    في هذا القسم من التعليمات البرمجية، نكتب اسم المستخدم للمستخدم لحالة الجلسة. نأخذ هذا الاسم من نموذج HTML الذي أرسل إلينا. بالإضافة إلى ذلك، من خلال الخصائص، نتعلم ما إذا كانت هذه الجلسة قد تم إنشاؤها للتو، أي كجزء من الطلب الحالي (إذا كان الأمر كذلك، فإن قيمة خاصية ISNEWSION ستكون مساوية لصحيح)، ومعرف الجلسة الفريد. سيتم تسجيل هذا المعرف بعد معالجة الاستعلام تلقائيا في ملفات تعريف الارتباط في الجلسة (إن لم يكن بعد) وإرسالها إلى استجابة العملاء.

    في متصفح العميل، يمكنك مراقبة ملفات تعريف الارتباط المناسبة ومعرف جلستها:

    في عملية الاستعلام التالي من هذا العميل، دعنا نقرأ اسمه المحفوظ مسبقا من الجلسة. أيضا الانتهاء قسرا. اكتمال العمل مع هذا العميل، على سبيل المثال، تتم معالجة جميع البيانات وإرسال المنتج.

    اسم مستخدم السلسلة \u003d جلسة [اسم المستخدم "]. ToString ()؛ // طلب معالجة ... Session.Abandon ()؛

    كما يمكن أن ينظر إليه، العمل مع جلسات بسيطة ومريحة للغاية. تحدث معظم العمليات المتعلقة بمعالجة الجلسة تلقائيا في الخلفية. بطبيعة الحال، قد يتدخل المطور في أي مرحلة من مراحل معالجة الجلسة وإجراء تعديلات عليها.

    دعونا نلقي نظرة على الخصائص والأساليب الأكثر إثارة للاهتمام فئة httpsessionstate، والتي تستخدم في معظم الأحيان في العمل:

    العنصر. - إرجاع عنصر البيانات في فهرسه
    العنصر. - إرجاع عنصر البيانات عن طريق المفتاح
    إزالة (الفهرس) - حذف عنصر البيانات في فهرسه
    إزالة (المفتاح) - يزيل عنصر البيانات عن طريق المفتاح
    صافي () - حذف جميع البيانات
    عدد - إرجاع إجمالي عدد عناصر البيانات للجلسة الحالية.
    يتخلى عن () - إكمال القسري الجلسة
    معرف جلسة العمل - إرجاع معرف الجلسة الحالية
    isnewsession. - إرجاع صحيح إذا تم إنشاء الجلسة كجزء من الطلب الحالي
    نفذ الوقت. - إرجاع عدد الدقائق المسموح بها بين الطلبات قبل الانتهاء من الجلسة بسبب المهلة (الافتراضي، 20 دقيقة)

    يمكنك تغيير إعدادات الجلسة إما برمجيا في التعليمات البرمجية عبر أعضاء فئة HTTPSessionSession أو من خلال تكوين التطبيق (). على سبيل المثال:

    في التكوين أعلاه، أشرنا إلى أن مهلة الدورات ستكون 40 دقيقة، سيتم تخزين بيانات جلسة المستخدم في ذاكرة الوصول العشوائيسيتم استخدام ملفات تعريف الارتباط الجلسة، كما غيرت الاسم القياسي لمثل ملفات تعريف الارتباط الخاصة به.

    وملاحظة أمان مهمة أخرى. عند إكمال جلسة المستخدم عن طريق Session.Abandon ()؛ لا يتم حذف معرف الطبخ في جلسة الجلسة، في متصفح المستخدم. هذا يعني أنه إذا بدأ المستخدم جلسة جديدة في المستقبل القريب، دون إغلاق المتصفح، سيتم تعيين جلسة له نفس الجلسة نفسها. يفضل أن تقوم كل جلسة جديدة دائما بتعيين معرف فريد جديد، لأننا نحتاج إلى حذف ملفات تعريف الارتباط الدورة يدويا بعد إغلاق الجلسة:

    الجلسة. الكلام ()؛ // تنظيف الجلسة. القابضة ()؛ / / نحن نلغ الجلسة // تنظيف ملفات تعريف الارتباط يدويا مثل الاشتراكات. add (httpcookie جديد ("asp.net_sessessyid"، ")؛ // أو تقليل عمر الاستجابة. Cookscookies ["asp.net_sessessyid"]. تنتهي \u003d dateetime.now.addyears (-30)؛ //asp.net_sessessyid هو الاسم القياسي لملفات تعريف الارتباط الجلسة، يمكنك أن يكون لديك

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

    تحياتي، مجتمع محترم.

    بادئ ذي بدء، أريد أن أشكر موردا مفيدا للغاية. وجدت أكثر من مرة العديد من الأفكار المثيرة للاهتمام والمشورة العملية هنا.

    الغرض من هذه المقالة هو تسليط الضوء على الحجارة تحت الماء لاستخدام الجلسات في PHP. بالطبع، هناك وثائق حول PHP والكثير من الأمثلة، وهذا المقال لا يتظاهر به دليل كاملوبعد وهي مصممة للكشف عن بعض الفروق الدقيقة للعمل مع جلسات وحماية المطورين من وقت القضاء غير الضروري.

    المثال الأكثر شيوعا لاستخدام الدورات هو، بالطبع، ترخيص المستخدم. لنبدأ بتنفيذ أكثر أساسية من أجل تطويره باستمرار كما تظهر مهام جديدة.

    (من أجل توفير المساحة والوقت، سنقوم بتقييد أنفسنا في الأمثلة فقط من خلال وظائف العمل مع جلسات، بدلا من بناء تطبيق اختبار كامل كامل هنا مع التسلسل الهرمي الجميل للدروس ومعالجة الأخطاء الشاملة وغيرها من الأشياء المناسبة) وبعد

    وظيفة بدء تشغيل الوظيفة (Session_Start ()؛ // ملاحظة: إلى الإصدار 5.3.0، تم إرجاع وظيفة Session_start () صحيحا حتى في حالة وجود خطأ. // إذا كنت تستخدم إصدارا أقل من 5.3.0، قم بإجراء فحص إضافي Session_id ( . 60 * 24)؛ // وتدمير جلسة الجلسة ()؛ session_destroy ()؛)

    ملحوظة: من المعلوم أن المعرفة الأساسية لجلسات PHP في القارئ لديها، وبالتالي فإن مبدأ تشغيل الدورة () والدورة_ وظائف -) لن تغطي هنا. لا تشير مهام نموذج التصميم ونموذج مصادقة المستخدم إلى موضوع المقالة، لذلك سنحذفها أيضا. اسمحوا لي أن أذكرك ذلك فقط لتحديد المستخدم في كل طلب لاحق، نحتاج إلى حفظها في وقت الإدخال الناجح في متغير الجلسة (مع اسم UserID، على سبيل المثال) معرف المستخدم، والذي سيكون متاحا في جميع اللاحق طلبات داخل حياة الجلسة. من الضروري أيضا تنفيذ معالجة نتيجة بدء التشغيل (). إذا عادت الوظيفة كاذبة - لعرض شكل الإدخال في المتصفح. إذا عادت الوظيفة TRUE، ومتغير الجلسة التي تحتوي على معرف مستخدم معتمد (في علمنا - Userid)، على سبيل المثال - عرض صفحة من مستخدم مخول (لمعالجة الأخطاء والمزيد، انظر الملحق من 2013-06-07 في القسم في متغيرات الجلسة).

    في حين أن كل شيء واضح. تبدأ الأسئلة عندما تكون هناك حاجة لتنفيذ عدم وجود نشاط المستخدم (مهلة الجلسة)، تمكين العمل المتزامن في متصفح واحد من عدة مستخدمين، وكذلك حماية جلسات الاستخدام غير المصرح به. سيتم مناقشتها أدناه.

    السيطرة على عدم وجود نشاط المستخدم مع PHP المدمج

    السؤال الأول، الذي ينشأ غالبا من مطوري جميع أنواع لوحات المفاتيح للمستخدمين - الانتهاء التلقائي للجلسة في غياب النشاط من المستخدم. لا يوجد شيء أسهل من القيام بذلك باستخدام ميزات PHP المدمجة. (لا يختلف هذا الخيار بشكل خاص الموثوقية والمرونة، ولكن اعتبره اكتمال الصورة).

    Startsession وظيفة () (/ / عدم وجود نشاط المستخدم (بالثواني) $ sessionlifetime \u003d 300؛ إذا (session_id ()) إرجاع true؛ // اضبط عمر ملف تعريف الارتباط ini_set ("session.cookie_lifetime"، $ sessionlifetime)؛ // إذا افتقد مهلة مجموعة نشاط المستخدم، اضبط عمر الجلسة على الخادم // ملاحظة: بالنسبة لخادم المنتج، فمن المستحسن منع هذه المعلمات في php.ini إذا ("sessionlifetime) ini_set (" session.gc_maxlifetime "، $ sessionlifetime)؛ إذا (session_start ()) (setcookie (session_name ()، session_id ()، الوقت ()، sessionlifetime؛ العودة TRUE؛) آخر عودة كاذبة؛)

    بعض التفسيرات. كما تعلمون، يحدد PHP جلسة واحدة تحتاج إلى تشغيلها، من خلال اسم طبخ، أرسلها المستعرض في رأس الطلب. يتلقى المتصفح، بدوره، ملف تعريف الارتباط هذا من الخادم حيث توجد أماكن وظيفة Session_Start (). إذا انتهت صلاحية عمر ملفات تعريف الارتباط في المتصفح، فلن يتم نقله في الاستعلام، مما يعني أن PHP لن تتمكن من تحديد الجلسة التي يجب إطلاقها، وتستثبط كخلق جلسة جديدة. معامل إعدادات PHP Session.gc_maxlifetime، الذي تم تعيينه على مهلة لدينا عدم وجود نشاط المستخدم، يحدد عمر جلسة PHP ويتم التحكم فيه بواسطة الخادم. إنه يعمل التحكم في حياة الجلسة على النحو التالي (هناك مثال على وحدة تخزين جلسة في الملفات المؤقتة كخيار الأكثر شيوعا وإعدادا في PHP).

    في وقت إنشاء جلسة جديدة في الدليل المثبت كدليل لتخزين جلسات في جلسة PHP.Save_Path Settings Parameter، يتم إنشاء الملف المسمى Sess_. أين - معرف الجلسة. علاوة على ذلك، في كل طلب، في وقت تشغيل الدورة الحالية بالفعل، يقوم PHP بتحديث وقت التعديل في هذا الملف. وبالتالي، في كل ساعة PHP التالية، من خلال الفرق بين الوقت الحالي ووقت التعديل الأخير لملف الجلسة، يمكن أن تحدد ما إذا كانت الجلسة نشطة، أو انتهت صلاحية عمرها بالفعل. (تعتبر آلية إزالة ملفات الجلسة القديمة بمزيد من التفصيل في القسم التالي).

    ملحوظة: تجدر الإشارة هنا إلى أن المعلمة Session.gc_maxlifetime صالحة لجميع الجلسات داخل خادم واحد (أكثر بدقة، داخل واحد رئيسي عملية فب). في الممارسة العملية، هذا يعني أنه إذا كان هناك العديد من المواقع على الخادم، ولكل منهم مهلة خاصة به لعدم وجود نشاط المستخدم، فإن تثبيت هذه المعلمة على أحد المواقع سيتم تثبيتها ومواقع أخرى. الأمر نفسه ينطبق على الاستضافة المشتركة. لتجنب مثل هذا الموقف، يتم استخدام أدلة جلسة منفصلة لكل موقع ضمن خادم واحد. يتم تعيين المسار إلى كتالوج الجلسة باستخدام Session.Save_Path المعلمة في ملف إعدادات PHP.INI، أو عن طريق استدعاء وظيفة ini_set (). بعد أن يتم تخزين هذه الدورة لكل موقع في أدلة منفصلة، \u200b\u200bوستكون معلمة Session.gc_maxlifetime المثبتة على أحد المواقع صالحة فقط في جلستها. لن ننظر في هذه الحالة بالتفصيل، خاصة وأن لدينا نسخة أكثر مرونة من عدم وجود نشاط المستخدم.

    السيطرة على عدم وجود نشاط المستخدم باستخدام متغيرات الجلسة

    يبدو أن الخيار السابق مع كل بساطته (مجرد خطوط إضافية من التعليمات البرمجية) يعطي كل ما نحتاج إليه. ولكن ماذا لو لم يكن كل طلب يمكن اعتبار نتيجة نشاط المستخدم؟ على سبيل المثال، يتم تعيين مؤقت على الصفحة، والتي تنفذ بشكل دوري طلب AJAX لتلقي التحديثات من الخادم. لا يمكن اعتبار مثل هذا الطلب نشاط مستخدم، مما يعني أن التمديد التلقائي لمدى الجلسة غير صحيح في هذه الحالة. لكننا نعلم أن PHP تقوم بتحديث وقت تعديل ملفات الجلسة تلقائيا في كل مرة يتم استدعاء الدالة Session_Start ()، مما يعني أن أي طلب سيؤدي إلى امتداد وقت حياة الجلسة، وعدم أن يأتي عدم وجود نشاط المستخدم أبدا. بالإضافة إلى ذلك، قد يبدو آخر ملاحظة من القسم السابق على تعقيدات Session.gc_maxlifetime لشخص مربك للغاية ومعقد في التنفيذ.

    لحل هذه المشكلة، سنرفض استخدام المدمج آليات PHP. ونحن نقدم العديد من متغيرات جلسة جديدة تسمح لنا بالتحكم في عدم نشاط المستخدم بنفسك.

    Startsession وظيفة ($ isessenlifetime \u003d true) ($ sessionlifetime \u003d 300؛ إذا (session_id ()) إرجاع true؛ // تثبيت عمر طبخ قبل إغلاق المستعرض (سوف تتحكم في كل شيء على جانب الخادم) ini_set ("session.cookie_lifetime"، 0)؛ إذا (! session_start ()) إرجاع false؛ $ t \u003d الوقت ()؛ إذا تم تحديد ($ sessionlifetime) (// إذا تم تحديد عدم وجود نشاط المستخدم، // التحقق من الوقت الذي مرت بهذا نشاط المستخدم الأخير // (آخر وقت للاستعلام عند تحديث متغير الجلسة الواسعة النشاطية) إذا تم تحديث متغير الجلسة الرئيسية) إذا (ISSET (LASES $ _ ["LastActivity"]) && $ T - $ _ $ _ _ $ _ ["Lastactivity"]\u003e \u003d $ sessionlifetime) (//\u003e إذا كان مر الوقت منذ آخر نشاط المستخدم، / / المزيد من انتهاء مهلة النشاط، مما يعني أن الدورة قد انتهت صلاحيتها، وتحتاج إلى إكمال المدمر ()؛ إرجاع False؛) آخر (// إذا كان المهلة لم يأت بعد، / / وإذا كان الاستعلام جاء نتيجة لنشاط المستخدم، // تحديث المتغير الأخير الحالي BP emeni، // remending وقت الجلسة لا يزال في SessionLeifetime ثواني إذا كان ($ isuseractivity) $ _session _session ["lastactivity"] \u003d $ t؛ \u003d $ t؛ \u003d $ t؛ )) إرجاع صحيح؛ في

    لخص. في كل طلب، نتحقق مما إذا كان سيتم الوصول إلى المهلة من لحظة نشاط المستخدم الأخير قبل اللحظة الحالية، وإذا تم تحقيق ذلك - نحن ندمر الجلسة وقطع الوظيفة، وإرجاع FALSE. إذا لم يتم تحقيق المهلة، ومعلمة ISUSeractivity $ مع قيمة TRUE - تحديث وقت النشاط الأخير للمستخدم. كل ما علينا القيام به هو تحديد البرنامج النصي للاتصال ما إذا كان الطلب هو نتيجة نشاط المستخدم، وإذا لم يكن كذلك، فاتصل بدالة StartSession مع قيمة المعلمة $ ISUSeractivity تساوي False.

    تحديث من 2013-06-07.
    معالجة نتيجة وظيفة الدورة ()

    لا تولي التعليقات حقيقة أن استرداد FALSE لا يفهم تماما سبب الخطأ، وهو عادل تماما. لم أنشأ هنا معالجة مفصلة للأخطاء (نطاق المقالة وليس صغيرا)، لأن هذا لا ينطبق مباشرة على موضوع المقال. ولكن النظر في التعليقات، وسوف توضح.

    كما ترون، يمكن لدالة Sessionstart العودة كاذبة في حالتين. أو لا يمكن إطلاق الجلسة بسبب بعض أخطاء الخادم الداخلي (على سبيل المثال، إعدادات الجلسة غير الصحيحة في php.ini)، أو انتهت صلاحية مدى الحياة الجلسة. في الحالة الأولى، يجب أن ننقل المستخدم إلى الصفحة مع وجود مشكلة في وجود مشاكل على الخادم، وشكل دعم الدعم. في الحالة الثانية، يجب علينا ترجمة المستخدم إلى نموذج الإدخال وإحضار الرسالة المناسبة إلى أن وقت الجلسة انتهت صلاحيته. للقيام بذلك، نحتاج إلى إدخال رموز الأخطاء وإرجاع التعليمات البرمجية المقابلة بدلا من FALSE، وطريقة الاتصال، والتحقق من ذلك وتعمل وفقا لذلك.

    الآن، حتى لو كانت الجلسة الموجودة على الخادم موجودا، فسيتم تدميرها في النداء الأول لذلك إذا انتهت مهلة عدم نشاط المستخدم. وهذا سيحدث بغض النظر عن الوقت الذي يتم تثبيت الدورات في إعدادات PHP العالمية.

    ملحوظة: ما يحدث إذا تم إغلاق المتصفح، وتم تدمير ملفات تعريف الارتباط مع اسم الجلسة تلقائيا؟ الطلب إلى الخادم، في المرة التالية التي تقوم فيها فتح المتصفح، لن تحتوي على جلسة ملفات تعريف الارتباط، ولن يتمكن الخادم من فتح الجلسة وتحقق من عدم وجود نشاط المستخدم. بالنسبة لنا، لا يعادل إنشاء جلسة جديدة ولا يؤثر على الوظيفة والسلامة. ولكن هناك سؤال عادل - ومن ثم يدمر بعد ذلك الجلسة القديمة، إذا ما زلنا دمرته بعد انتهاء الطعيم؟ أو هل ستعلق الآن في كتالوج الدورات إلى الأبد؟ لتنظيف الجلسات القديمة في PHP، هناك آلية تسمى جمع القمامة. يبدأ في وقت الطلب التالي إلى الخادم وينظف جميع الجلسات القديمة على أساس التاريخ اخر تغير ملفات الجلسة. ولكن بدء آلية جمع القمامة لا يحدث في كل طلب إلى الخادم. يتم تحديد التردد (أو بالأحرى، احتمال) بدء التشغيل بواسطة معلمين من Session.gc_probability و Session.gc_divisor. النتيجة من تقسيم المعلمة الأولى إلى الثانية وهي احتمال إطلاق آلية جمع القمامة. وبالتالي، بحيث يتم إطلاق آلية تنظيف الجلسات مع كل طلب إلى الشئ، يجب تعيين هذه المعلمات على القيم المتساوية، على سبيل المثال "1". يضمن هذا النهج طهارة دليل الجلسة، ولكن من الواضح أن تكون مفرطة جدا للخادم. لذلك، في أنظمة المنتجات الافتراضية، يتم تعيين قيمة Session.gc_divisor، تساوي 1000، مما يعني أن آلية جمع القمامة سيتم إطلاقها باحتمال 1/1000. إذا قمت بتجربة هذه الإعدادات في ملف php.ini الخاص بك، فيمكنك ملاحظة أنه في المرحلة الموضحة أعلاه، عندما يغلق المستعرض ويمسح جميع ملفات تعريف الارتباط الخاصة بك، في كتالوج الجلسة، لبعض الدورات القديمة في الوقت لا تزال. ولكن يجب أن لا تقلق لك، ل كما ذكرنا بالفعل، فإنه لا يؤثر بأي حال سلامة آليتنا.

    تحديث من 2013-06-07.

    منع Hangs Script بسبب حظر ملف الجلسة

    في التعليقات أثارت مسألة تعليق البرامج النصية التي تعمل في وقت واحد بسبب حظر ملف الجلسة (كخيار ألمع - استطلاع طويل).

    لبدء، لاحظ أن هذه المشكلة لا تعتمد بشكل مباشر على تحميل الخادم أو عدد المستخدمين. بالطبع، مزيد من الطلبات، يتم تنفيذ الاستعلام أبطأ. ولكن هذا اعتماد هوز. تظهر المشكلة فقط في نفس الجلسة عندما يأتي الخادم عدة طلبات نيابة عن مستخدم واحد (على سبيل المثال، أحدهما استطلاع طويل، والباقي طلبات طبيعية). يحاول كل طلب الوصول إلى نفس ملف الجلسة، وإذا لم يقم الاستعلام السابق بإلغاء تأمين الملف، فسوف يتعطل القادم الانتظار.

    لإغلاق ملفات الجلسة لتقليلها، يوصى بشدة بإغلاق الجلسة عن طريق استدعاء وظيفة Session_Write_Close () فورا بعد إجراء جميع الإجراءات ذات المتغيرات الستاحية. في الممارسة العملية، هذا يعني أنه لا ينبغي تخزينه في متغيرات الجلسة على التوالي والاتصال بهم طوال تنفيذ البرنامج النصي. وإذا كنت بحاجة إلى تخزين بعض بيانات العمل في متغيرات الجلسة، فأنت قرأتها على الفور عند بدء الجلسة، حفظ المتغيرات المحلية للاستخدام اللاحق وإغلاق الجلسة (يعني إغلاق الجلسة باستخدام وظيفة Session_Write_Close، وليس الدمار باستخدام Session_destroy).

    في مثالنا، هذا يعني أنه بعد فتح الدورة مباشرة، والتحقق من وقت حياته ووجوده لمستخدم معتمد، يجب أن نقرأ وحفظ جميع التطبيقات الإضافية لمتغيرات الجلسة (إذا كان هناك مثل هذا)، وبعد ذلك بالقرب من الجلسة عن طريق الاتصال Session_Write_Close () ومتابعة تنفيذ البرنامج النصي، سواء استطلاع طويل أو استعلام منتظم.

    حماية الجلسات من الاستخدام غير المصرح به

    تخيل الوضع. أحد مستخدمي المستخدمين من كلينان، الذين يسرقون باقة المتصفح (يتم تخزين جلسةنا) ويرسله إلى البريد الإلكتروني المحدد. يحصل المهاجم على ملفات تعريف الارتباط ويستخدمه لاستعلام مزيف نيابة عن مستخدمنا المعتمدين. يقبل الخادم بنجاح ويعالج هذا الطلب، كما لو جاء من مستخدم مخول. إذا تم تنفيذ فحص عنوان IP إضافي، فإن مثل هذا الهجوم سيؤدي إلى حساب مستخدم عصري ناجح مع جميع العواقب التي تلت ذلك.

    لماذا كان ذلك ممكنا؟ من الواضح، لأن اسم ومعرف الجلسة هي نفسها دائما في نفس الوقت من الجلسة، وإذا تلقيت هذه البيانات، فيمكنك بسهولة إرسال طلبات نيابة عن مستخدم آخر (بشكل طبيعي، ضمن عمر هذه الجلسة). ربما ليس هذا هو النوع الأكثر شيوعا من الهجمات، ولكن من الناحية النظرية، يبدو أن كل شيء يمكن تحقيقه تماما، خاصة بالنظر إلى أن حقوق المسؤول لا تحتاج حتى إلى هذا طروادة لسرقة ملفات تعريف الارتباط متصفح المستخدم.

    كيف يمكنني الحماية من هجمات هذا النوع؟ مرة أخرى، من الواضح أن الحد من عمر معرف الجلسة وتغيير المعرف بشكل دوري خلال جلسة واحدة. يمكننا أيضا تغيير اسم الجلسة، وإزالة الرسم القديم تماما وخلق جلسة جديدة عن طريق نسخ جميع متغيرات الجلسة من القديم. لكنها لا تؤثر على جوهر النهج، وبالتالي بالنسبة للبساطة، يقتصر على معرف الدورة.

    من الواضح أن أصغر عمر معرف الجلسة، ووقت أقل سيكون في المهاجم للحصول على ملفات تعريف الارتباط وتطبيق طلب المستخدم المزيف. في الحالة المثالية، يجب استخدام معرف جديد لكل طلب، والذي سيسمح لك بتقليل إمكانية استخدام جلسة شخص آخر. لكننا نعتبر الحالة العامة عندما يتم تعيين وقت تجديد معرف الدورة بشكل تعسفي.

    (خفض جزء من التعليمات البرمجية التي تم النظر فيها بالفعل).

    Startsession وظيفة ($ isuseractivity \u003d true) (// وقت حياة معرف الجلسة $ idlifetime \u003d 60؛ ... إذا ($ Idlifetime) (// إذا تم تعيين عمر معرف الجلسة، // التحقق من الوقت التي مرت منذ الجلسة أو تجديد الدورة الأخيرة // (وقت الاستعلام الأخير عند تحديث وقت بدء تشغيل الجلسة) إذا كان (ISSET (RESSET $ _ الجلسة ["StartTime"])) (إذا كانت جلسة العمل ($ _ $ _ "وقت البدء"]\u003e \u003d IDLIFETIME (IDLIFETIME) \u003d $ Idlifetime) (// الوقت معرف جلسة نمط الحياة // إنشاء معرف جلسة جديدة_REGENERAERE_ID (صحيح)؛ $ _session ["بدء الوقت"] \u003d $ t؛) آخر (// هنا نحصل عليه إذا كانت الجلسة تم إنشاؤه للتو // تعيين وقت توليد معرف الجلسة في الوقت الحالي $ _session ["وقت التشغيل"] \u003d $ t؛) العودة True؛)

    لذلك، عند إنشاء جلسة جديدة (والتي تحدث في وقت تسجيل دخول المستخدم الناجح)، حددنا متغير جلسة بدء الوقت المخزنة بالنسبة لنا الجيل الأخير من معرف الجلسة، إلى القيمة المساوية لوقت الخادم. بعد ذلك، في كل طلب، نتحقق مما إذا كان الوقت الكافي (IDLIFETIME) لم يتم تمريره منذ الجيل الأخير من المعرف، وإذا مرت - نحن نولد واحدة جديدة. وبالتالي، إذا كان المهاجم الذي تلقى ملفات تعريف الارتباط للمستخدم المعتمد الذي حصل على معرف معرف المعرف ليس لديه وقت لاستخدامه، فسيتم اعتبار الطلب المزيف من قبل الخادم باعتباره غير مصرح به، وسوف يسقط المهاجم على صفحة الدخول.

    ملحوظة: يدخل معرف الجلسة الجديد ملفات تعريف الارتباط للمتصفح عند استدعاء الدالة Session_regenerate_Id ()، والتي ترسل ملفات تعريف ارتباط جديدة، مشابهة لوظيفة Session_Start ()، لذلك لا نحتاج إلى تحديث ملفات تعريف الارتباط بنفسك.

    إذا كنا نريد تأمين جلساتنا قدر الإمكان قدر الإمكان، فهذا يكفي إنشاء مدى عمر المعرف مدى الحياة أو عموما لتحمل الدالة Session_regenerate_Id () لوظيفة الأقواس وإزالة جميع الشيكات، والتي ستؤدي إلى تجديد المعرف في كل طلب. (لم أتحقق من تأثير نهج السرعة مثل هذه السرعة، ويمكنني فقط أن أقول إن الدالة Session_regenerate_id (True) تؤدي أساسا 4 خطوات: إنشاء معرف جديد، وإنشاء رأس مع جلسة الطبخ، وحذف القديم وخلق جلسة جديدة ملف).

    digression غنائي: إذا اتضح Troyans أن يكون ذكيا، فلن يرسل ملفات تعريف الارتباط إلى مهاجم، وينظم إرسال طلب مزيف محدد مسبقا على الفور عند استلام الطهي، والطريقة الموضحة أعلاه، على الأرجح، لن تكون قادرة على الحماية من هذا هجوم، لأنه بين وقت استقبال ملفات تعريف الارتباط طروادة وإرسال الاستفسار وهمية لن يكون هناك فرق تقريبا، والاحتمالية كبيرة في هذه المرحلة لن تتلقى تجديد معرف الجلسة.

    القدرة على العمل في وقت واحد في متصفح واحد نيابة عن العديد من المستخدمين

    المهمة الأخيرة التي أود أن أعتبرها هي إمكانية العمل في وقت واحد في متصفح واحد من عدة مستخدمين. هذه الميزة مفيدة بشكل خاص في مرحلة الاختبار عندما تحتاج إلى محاكاة التشغيل المتزامن للمستخدمين، ومن المستحسن القيام بذلك في متصفحك المفضل، وعدم استخدام ترسانات كاملة بأكملها أو فتح العديد من مثيلات المتصفح في "التخفي " الوضع.

    في أمثلةنا السابقة، لم نحدد اسم الجلسة، لذلك يتم استخدام الاسم الافتراضي في PHP. هذا يعني أن جميع الجلسات التي تم إنشاؤها من قبلنا حتى الآن أرسلت مستعرض طبخ تحت اسم phpsessid. من الواضح، إذا كان اسم الطبخ هو نفسه دائما، فلا يوجد إمكانية داخل متصفح واحد لتنظيم دورتين بنفس الاسم. ولكن إذا استخدمنا اسم الجلسة الخاصة بنا لكل مستخدم، فسيتم حل المشكلة. و افعلها.

    بدء تشغيل الوظيفة ($ isuseractivity \u003d True، $ Prefix \u003d NULL) إرجاع True؛ // (إذا كانت المعلمات تمر بادئة المستخدم، / / قم بتعيين اسم الجلسة الفريد، بما في ذلك هذه البادئة، // قم بتثبيت بشكل خلاف ذلك لجميع مستخدمي المستخدمين (على سبيل المثال، MyProject) Session_name ("maimproject". (بادئة $؟ "_." بادئة $: "")؛ ini_set ("session.cookie_lifetime"، 0)؛ إذا (! session_start ()) العودة كاذبة؛ ...)

    الآن يبقى العناية بأنه يتم إرسال برنامج نص البرنامج النصي للاتصال إلى StartSession () بادئة فريدة لكل مستخدم. يمكن القيام بذلك، على سبيل المثال، من خلال Transfix إلى معلمات GET / POST لكل طلب أو من خلال ملفات تعريف ارتباط إضافية.

    استنتاج

    في الختام، سأقدم رمز النهاية الكامل لوظائفنا للعمل مع جلسات PHP.والتي تشمل جميع المهام التي تمت مناقشتها أعلاه.

    Startsion وظيفة ($ isuseractivity \u003d True، Prefix $ \u003d NULL) ($ sessionlifetime \u003d 300؛ idlifetime \u003d 60؛ إذا (session_id ()؛ "" ")؛ ini_set (" session.cookie_lifetime "، 0)؛ إذا (! session_start ()) إرجاع false؛ $ t \u003d الوقت ()؛ إذا ($ sessionlifetime) (إذا (ISSET ($ _ الجلسة [" "]) && $ T - $ _ جلسة _ $ [" lastactivity "]\u003e \u003d $ sessionlifetime) (dreadsession ()؛ إرجاع false؛) آخر (إذا كان ($ isuseractivity) $ _Session $ _Session [" lastactivity "] \u003d $ t؛] \u003d $ t؛) (Idlifetime $) (إذا (ISSET ($ _ Session ["StartTime"])) (إذا كان ($ T - $ _ _ $ _ ["بدء التشغيل"]\u003e \u003d $ Idlifetime) (Session_regenerate_id (True)؛ $ _session ["وقت التشغيل" ] \u003d $ t؛))) آخر ($ _session ["starttime"] \u003d $ t؛) العودة True؛) وظيفة dreadsession () (if_unset ()؛ setcookie (session_name ()، session_id ()، الوقت () -60 * 60 * 24)؛ session_destroy ()؛))

    آمل أن تنقذ هذه المقالة بعض الوقت لأولئك الذين لم تعمقوا أبدا في آلية الدورة، وسيعطي فهم كاف لهذه الآلية لأولئك الذين بدأوا للتو في التعرف على PHP.

    في الوحدة النمطية نشط كيسيا يمكنك مشاهدة قائمة المستخدمين الذين يعملون مع لوحة التحكم في أي وقت. هذه اللحظةعنوان IP الذي يصل إليه المستخدم والوقت الذي تم تمريره من لحظة تلقي الأمر الأخير من هذا المستخدم.

    إذا لزم الأمر، يمكنك إكمال جلسة المستخدم المحدد.

    وحدة "جلسات نشطة"

    عرض معلومات الاتصال الحالية

    • معرف جلسة العمل - رقم فريد يحدد جلسة مع لوحة التحكم. بشكل افتراضي، يتم عرض المعلومات في الجدول لمدة 60 دقيقة.
    • المستعمل - اسم المستخدم المتصل بالنظام هو حاليا.
    • وصول - مستوى الوصول من هذا المستخدم إلى لوحة التحكم (على سبيل المثال، Superuser، مسؤول الخادم، المستخدم، إلخ).
    • عنوان IP - عنوان IP عن بعد هو الوصول المتاح.
    • توقع - الوقت الذي تم تمريره من لحظة تلقى لوحة التحكم الأوامر الأخيرة من المستخدم.
    • طلبات نشطة - عدد الطلبات النشطة.

    الانتهاء من الجلسة

    لإكمال هذه الجلسة أو تلك الجلسة مع لوحة التحكم، قم بتسلط الضوء على الصفوف المطلوبة في قائمة الجلسات النشطة وانقر فوق "إنهاء".

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

    إذا تم الانتهاء من الجلسة، لمزيد من العمل مع لوحة التحكم، يجب على المستخدم تسجيل الدخول مرة أخرى.

    هذا النموذج ليس نداء لدعم.
    لا يمكننا تحديدك والإجابة على رسالتك.

    الجلسة (من LAT. - Sessio - اجتماع، دورة اللغة الإنجليزية) - هذه فترة زمنية تغطي المستخدم على الإنترنت من لحظة فتح الروابط الأولى وإلى آخر. يتم حساب الفارق الزمني بين الطلبات الأولية والنهائية. ومع ذلك، يمكن عرض الصفحة الأخيرة من قبل المستخدم في أوقات مختلفة، مما، لذلك، فإن قياس الوقت بين طلبين يصبح أكثر صعوبة.

    كيف هي الجلسة مع بروتوكول HTTP وملفات تعريف الارتباط

    ما يمكن تفسير هذه الجلسة من خلال الدفع من بروتوكول HTTP. من تلقاء نفسها، لا يملك هذا البروتوكول وسيلة للحفاظ على الدولة بين عملين. هؤلاء.، ببساطة وضعت، فتح صفحة واحدة، ثم، الذهاب من ذلك إلى آخر، لن يتمكن HTTP من تحديد أن كلا الطلبين ينتمي إلى مستخدم واحد. وهنا مساعدة طريقة تتبع خاصة تأتي إلى مساعدة - السيطرة على الدورات (من قبل جلساتنا).
    من هنا، الرد على السؤال أي نوع من الجلسة، يمكننا القول أن هذا هو كائن منطقي إضافي يعزز نقل البيانات بين طلبات HTTP المتتابعة من مستخدم واحد.
    ملفات تعريف الارتباط، مثل الجلسة، تخزن معلومات حول المستخدم أثناء تحركها على صفحات مختلفة وتحسين تشغيل البروتوكول. ولكن على عكس الثانية، حيث يتم تخزين البيانات في الملفات المؤقتة على الخادم، فإنها تخزينها على كمبيوتر مستخدم في شكل شظايا صغيرة.

    من أجل جلسات الحاجة

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

    مراحل الدورة

    يمكن تقسيم جميع الجلسة إلى ثلاث مراحل:

    • الجلسة الافتتاحية (عندما يبدأ المستخدم في العمل مع موقع معين)،
    • محاسبة جلسات متغيرة (عند الانتقال إلى صفحات مختلفة)،
    • الانتهاء من الجلسة.

    نظرا لحقيقة أن هذه الجلسات يتم تخزينها على خادم جهة خارجية، فمن الأفضل عدم الحفاظ على كميات كبيرة من المعلومات فيها، ولكن لاستخدام ملفات تعريف الارتباط.