لا اعرف بالضبط ماللذي تعرفه و مالذي لا تعرفه لذلك ساقوم بشرح نظري عام على فكرة الباسوورد و السيشن.
اولا: الباسوورد كما تعرف هي عبارة عن مصفوفة نصية string يختارها المستخدم لتسجيل دخوله او لتأكيد هويته.
يجب عليك ان لا تحتفظ بهذا الباسوورد في اي مكان داخل النظام او داخل قاعدة البيانات. لا تخزنها ابداً! عوضاً عن تخزينها كما هي، يجب اولا ان تقوم بتشفيرها ثم تخزن النسخة المشفرة، و يجب ان يكون التشفير يتبع اسلوب معين بحيث:
يستحيل تخمين الباسوورد الاصلي من الباسوورد المشفر
يمكن اذا حصلت على الباسوورد الاصلي ان تقارنه بالباسوورد المشفر للتأكد من تطابقه
هناك خوارزمية معروفة للقيام بهذه المهمة اسمها bcrypt و مهما كانت لغة البرمجة اللتي تستخدمها لا بد ان هناك مكتبة توفر هذه الخوارزمية. هذه المكتبة في الغالب سيكون فيها عمليتين او فنكشنين اثنين:
hash_password(plain_text) -> hashed_password
validate_password(plain_text, hashed) -> boolean
الفنكشن الاول ياخذ الباسوورد الاصلي و يعطيك الباسوورد المشفر.
الفنكشن الثاني ياخذ الباسوود الاصلي و المشفر و يخبرك ان كان هناك تطابق ام لا.
طيب، الان لنفترض ان المستخدم قام باعطائك الباسوورد الخاص به لكي يدخل للموقع، و قد قمت بالتأكد من ان الباسوورد بالفعل مطابقة للباسوورد المشفر عندك، و بذلك تأكدت من هوية المستخدم.
الان ماذا يجب ان يحصل؟ المستخدم يتوقع انه حين يعطيك الباسوورد مرة واحدة فهذا سيكفي، و لا داعي ان يعطيك الباسوورد الخاص به للدخول الى كل صفحة على حدة.
هنا يأتي دور الكووكيز: تقوم بتخزين شيء ما في متصفح المستخدم يخبرك بهوية المستخدم، و لكن يجب ان يحتوي على الشيء على الخصائص التالية:
لا يمكن لأي شخص ان يحزر ما هو هذا الشيء اللذي وضعته في الكووكيز، و إلا فسيكون من الممكن لأي مستخدم ان ينتحل شخصية مستخدم آخر عن طريق التلاعب بالكووكيز الخاصة به.
لا يجب ان يكون هذا الشيء هو الباسوورد نفسه، لاننا نبهنا في البداية انك يجب ان لا تخزن الباسوورد في أي مكان في النظام، سواءً على قاعدة بياناتك او في الكووكيز.
لا يجب ان يكون هذا الشيء هو الباسوورد المشفر، لان الباسوورد المشفر نفسه سيصبح مثل الباسوورد في هذه الحالة.
ملاحظة: الباسوورد هو شيء من كان يمتلكه و يعرف يصبح قادراً على انتحال شخصية المستخدم.
اذن يجب ان يكون هذا الشيء اللذي تضعه مثل الباسوورد المؤقت: عبارة عن نص طويل (مصفوفة من الحروف و الارقام) كأنه مشفر و يؤكد هوية المستخدم و لكنه مؤقت بحيث لو تم تسريبه الى مستخدم آخر بعد فترة من الزمن فلن يتمكن ذلك المستخدم الاخر من انتحال الشخصية.
هذا الشيء يمكن ان نسميه session token او توكن اختصاراً
يمكن ان يكون هذا التوكن هو نص عشوائي تقوم باختراعه داخل السرفر، و يمكن في هذه الحالة ان تضع جدولاً في قاعدة البيانات يربط هذا التوكن بهوية المستخدم و تاريخ انتهاء صلاحية التوكن، و تضع هذا التوكن في الكووكيز، و سوف تقوم باستخدام هذا التوكن للتأكد من هوية المستخدم في كل مرة يطلب فيها صفحة جديدة. اذا قام المستخدم بطلب صفحة و كان التوكن قديما (اي منتهي الصلاحية) فعليك ان ترفض الطلب و تعتبر ان الـ session قد انتهى و يجب على المستخدم ان يلج الى النظام من جديد.
يمكن ايضا ان تضيف خاصية بأنه حين يصبح هذا التوكن على وشك الانتهاء تقوم بتجديده: اي تقوم بانشاء توكن جديد و تضعه في الكووكيز بدل التوكن القديم.
طبعاً هناك نقطة مهمة جداً قبل و بعد كل هذا الكلام:
اي نظام login احترافي يجب ان يكون وراء اتصال مشفر يعني يجب ان يكون الموقع https و ليس فقط http
التعليقات