الجلسة (session) و الكوكيز (cookie) في نظام تسجل الدخول (Login System)؟


التعليقات

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

اولا: الباسوورد كما تعرف هي عبارة عن مصفوفة نصية string يختارها المستخدم لتسجيل دخوله او لتأكيد هويته.

يجب عليك ان لا تحتفظ بهذا الباسوورد في اي مكان داخل النظام او داخل قاعدة البيانات. لا تخزنها ابداً! عوضاً عن تخزينها كما هي، يجب اولا ان تقوم بتشفيرها ثم تخزن النسخة المشفرة، و يجب ان يكون التشفير يتبع اسلوب معين بحيث:

  • يستحيل تخمين الباسوورد الاصلي من الباسوورد المشفر

  • يمكن اذا حصلت على الباسوورد الاصلي ان تقارنه بالباسوورد المشفر للتأكد من تطابقه

هناك خوارزمية معروفة للقيام بهذه المهمة اسمها bcrypt و مهما كانت لغة البرمجة اللتي تستخدمها لا بد ان هناك مكتبة توفر هذه الخوارزمية. هذه المكتبة في الغالب سيكون فيها عمليتين او فنكشنين اثنين:

 hash_password(plain_text) -> hashed_password

validate_password(plain_text, hashed) -> boolean

الفنكشن الاول ياخذ الباسوورد الاصلي و يعطيك الباسوورد المشفر.

الفنكشن الثاني ياخذ الباسوود الاصلي و المشفر و يخبرك ان كان هناك تطابق ام لا.

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

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

هنا يأتي دور الكووكيز: تقوم بتخزين شيء ما في متصفح المستخدم يخبرك بهوية المستخدم، و لكن يجب ان يحتوي على الشيء على الخصائص التالية:

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

  • لا يجب ان يكون هذا الشيء هو الباسوورد نفسه، لاننا نبهنا في البداية انك يجب ان لا تخزن الباسوورد في أي مكان في النظام، سواءً على قاعدة بياناتك او في الكووكيز.

  • لا يجب ان يكون هذا الشيء هو الباسوورد المشفر، لان الباسوورد المشفر نفسه سيصبح مثل الباسوورد في هذه الحالة.

ملاحظة: الباسوورد هو شيء من كان يمتلكه و يعرف يصبح قادراً على انتحال شخصية المستخدم.

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

هذا الشيء يمكن ان نسميه session token او توكن اختصاراً

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

يمكن ايضا ان تضيف خاصية بأنه حين يصبح هذا التوكن على وشك الانتهاء تقوم بتجديده: اي تقوم بانشاء توكن جديد و تضعه في الكووكيز بدل التوكن القديم.

طبعاً هناك نقطة مهمة جداً قبل و بعد كل هذا الكلام:

اي نظام login احترافي يجب ان يكون وراء اتصال مشفر يعني يجب ان يكون الموقع https و ليس فقط http

جزء عمل hash للباسورد و استخدام دوال bcrypt كنت قد انتهية من برمجته فعلا

اما جزء الsession فهته جزيت خيرا , لكن اذا نظرة لكوكيز المواقع تجدها تستخدم اكثر من كوكيز مثلا انظر الي كوكيز موقع حاسوب يقوم بارسال 7 كوكيز:

stript_mid , _stript_sid , remember_user_token , login_started_at , token , sut , account_session

وكل كوكيز يحتوي علي (value(token

وعند تسجيل خروج لا يقوم بحذف اي من هذه الكوكيز !!! , اذا عندما اعمل تسجيل خروج و اطلب صفحة كيف يفرق بين من عمل تسجيل خروج ومن لم يعمل؟؟ هذه الجزئية لا افهمها و لماذا يستخدم اكثر من كوكيز في معظم المواقع كذلك؟

زدني علما بارك الله فيك.

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

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

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

خاصية الكووكيز في المتصفحات تقوم بهذا العمل تلقائيا، ولا تتطلب اي برمجة اضافية من صاحب الموقع.

الطريقة الاخرى اللتي تتطلب برمجة بالجافاسكربت هي باستخدام localStorage و هي خاصية في المتصفح تمكن اي موقع من تخزين قدر معين من المعلومات في المتصفح و لكنها بعكس الكووكيز لا يتم ارسالها تلقائيا الى الموقع مع كل طلب. و لكن اذا كان الموقع مبرمج كله بالجافا سكربت و كل الطلبات يقوم بها الموقع عن طريق الجافا سكربت فيمكن قرائة قيمة معينة من الـ localStorage و ارسالها يدويا مع كل طلب عن طريق (مثلا) اضافتها الى header معين مع الطلب.

لا اعرف اذا كانت فكرة الـ request header مألوفة لديك ام بحاجة الى شرح.

اهااا اتضحة لي الفكرة الان , لم اكن اعلم ان هنالك طرق اخري لعمل ذلك

 الhttp header قمت بالبحث عنه الان و اتضح لي

 معرفتي بالjavascript ضعيفة لكنني مستمر في تعلمها ان شاء الله

اقرأه سيساعدك كثيرا

الرابط جيد , لكن لا يحتوي علي تفصيل واضح

الكوكيز لن يفيدك بشيء في نظام تسجيل الدخول

الكوكيز يفيد اذا قمت بخاصيه Save My Password/username

هل احتاج عمل جدول في قاعدة البيانات للsession او الcookie لتخزين بيانات عنهم اذا كان الجواب نعم ماهي الحقول بالظبط ؟

استحدامك لقواعد البيانات سوف يغنيك عن ال session في PHP7

بالنسبه لحذف الكوكيز هناك بارمتر عند انشاء الكوكيز وهي وضع مده عينه للكوكيز

او يستطيع المستخدم حذفه من المتصفح

انا لا استخدم php

اذا استخدمة قاعدة البيانات فقط في عملية تسجيل الدخول فإن مجرد قفل الtap و فتحها مره اخي ستكون فقدت المصادقة (حدث تسجيل خروج) اظن ان هذه كارثة , وهذا ما يحدث معي الان.

الكوكيز يفيد في زرع الid session

استطيع برمجة برميترز الكوكيز و ارسالة في جهاز المستخدم و حذفه و جلبه

لكن المشكلة كيف احافظ علي المصادقة ( تسجيل الدخول)؟


تطوير الويب

مجتمع خاص بمناقشة وطرح المواضيع والقضايا العامة المتعلقة بتطوير الويب ولغاتها المختلفة

88.7 ألف متابع