اذهب إلى المحتوى

السؤال

نشر

جربت هذا الكود لتكوين الرمز المميز للتوكين 

<?php
function base64($data) 
{
  
  return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');

} # Filtering (URLEncode)

$whoami = '1337r00t'; // Client's User

$headers = base64(json_encode(['alg'=>'HS256','typ'=>'JWT'])); // Headers

$payload = base64(json_encode(['WhoAmI'=>$whoami,'iat'=>time(),'id'=>1223])); // Payload

$secret = 'Key1234'; // Secret Key

$signature = base64(hash_hmac('SHA256',"$headers.$payload",$secret,true)); // Signature

$jwt = "$headers.$payload.$signature"; // JWT

echo $jwt. '<br>'; 
#eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJXaG9BbUkiOiIxMzM3cjAwdCIsImlhdCI6MTU1Njk2MzY3Mn0.1_gqGBADyt1MfF59xG8PTbg49vM0XE6r0Ed7yXbSAVs

?>

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

لا أعرف كل هاته الأمور ، هل يمكن إضافة شرح مفصلٍ مدعم بالأمثلة ؟

Recommended Posts

  • 0
نشر

في العادة يتم إستعمال التوكين لتوثيق طلبات الـ HTTP أو التحقق من صلاحياتها في طلب مورد ما . كطريقة عامة في إستعماله ،لنقل أنه يتبع المنطق التالي : 

  1. يتم إنشاء العمودين بجدول المستخدمين : 
    token VARCHAR(255)
    token_expires_at TIMESTAMP
    حيث أن تخزين السلسلة النصية اللتي يتم توليدها في العمود token ، في حين أن العمود token_expires_at سيحمل تاريخ إنتهاء صلاحية هذا الرمز . 
  2. عند طلب المصادقة و تسجيل الدخول يتم إستقبال طلب العميل من الخادم . سيتم أولا التحقق من بيانات هذا المستخدم ، ثم سيتم توليد سلسلة نصية . 
  3. سيتم تخزين هاته السلسلة النصية في عمود token الخاص بهذا العضو المستهدف ، كما سيتم تحديث عمود token_expires_at وإرفاق تاريخ جديد . 
  4. يقوم الخادم بمصادقة الطلب وإعادة هذا الـ token في رد إلى العميل . 
  5. يقوم العميل بإستقبال رد الخادم وتخزين هذا الـtoken ، يمكن تخزينه في التخزين المحلي LocalStorage أو عن طريق ملفات تعريف الإرتباط Cookies .  
  6. في الطلبات القادمة سيتم قراءة الـ token من التخزين المحلي و إرساله مع الطلب . 
  7. يقوم الخادم بالتحقق من وجود token مماثل مخزن وغير منتهي الصلاحية . يكون ذلك عن طريق التحقق من وجود السلسلة النصية التي يرسلها المستخدم بجدول المستخدمين ، وبمقارنة تاريخ إرسال الطلب بتاريخ إنتهاء صلاحية التوكين . 
  8. سيمكن بناءا على ذلك توثيق الطلب ومصادقته ، أو رفض الطلب وإعلام المستخدم بإنتهاء صلاحية رمزه وطلب إعادة تسجيل الدخول مثلا . 

 

  • 0
نشر
بتاريخ On 11/16/2021 at 19:24 قال Adnane Kadri:

في العادة يتم إستعمال التوكين لتوثيق طلبات الـ HTTP أو التحقق من صلاحياتها في طلب مورد ما . كطريقة عامة في إستعماله ،لنقل أنه يتبع المنطق التالي : 

  1. يتم إنشاء العمودين بجدول المستخدمين : 
    
    token VARCHAR(255)
    token_expires_at TIMESTAMP
    حيث أن تخزين السلسلة النصية اللتي يتم توليدها في العمود token ، في حين أن العمود token_expires_at سيحمل تاريخ إنتهاء صلاحية هذا الرمز . 
  2. عند طلب المصادقة و تسجيل الدخول يتم إستقبال طلب العميل من الخادم . سيتم أولا التحقق من بيانات هذا المستخدم ، ثم سيتم توليد سلسلة نصية . 
  3. سيتم تخزين هاته السلسلة النصية في عمود token الخاص بهذا العضو المستهدف ، كما سيتم تحديث عمود token_expires_at وإرفاق تاريخ جديد . 
  4. يقوم الخادم بمصادقة الطلب وإعادة هذا الـ token في رد إلى العميل . 
  5. يقوم العميل بإستقبال رد الخادم وتخزين هذا الـtoken ، يمكن تخزينه في التخزين المحلي LocalStorage أو عن طريق ملفات تعريف الإرتباط Cookies .  
  6. في الطلبات القادمة سيتم قراءة الـ token من التخزين المحلي و إرساله مع الطلب . 
  7. يقوم الخادم بالتحقق من وجود token مماثل مخزن وغير منتهي الصلاحية . يكون ذلك عن طريق التحقق من وجود السلسلة النصية التي يرسلها المستخدم بجدول المستخدمين ، وبمقارنة تاريخ إرسال الطلب بتاريخ إنتهاء صلاحية التوكين . 
  8. سيمكن بناءا على ذلك توثيق الطلب ومصادقته ، أو رفض الطلب وإعلام المستخدم بإنتهاء صلاحية رمزه وطلب إعادة تسجيل الدخول مثلا . 

 

كيف اذا كان المستخدم مسجلا للدخول من عدة متصفحات؟ هل سوف يتم إلغاء تسجيل دخوله في باقي المتصفحات في حال سجل الدخول في متصفح جديد أم لا؟

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

  • 0
نشر
بتاريخ On 11/16/2021 at 19:42 قال علي الكاسر:

كيف اذا كان المستخدم مسجلا للدخول من عدة متصفحات؟ هل سوف يتم إلغاء تسجيل دخوله في باقي المتصفحات في حال سجل الدخول في متصفح جديد أم لا؟

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

اقتباس

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

الاحتفاظ بتسجيل الدخول سيفرض تمديد المهلة الزمنية التي تنتهي فيها صلاحية التوكن في الخطوة الثالثة :

اقتباس

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

أما عن الوقوع في الثغرات الأمنية بهذا الخصوص فلا مشكلة في تخزين رمز المصادقة في الواجهة الأمامية ، لأن العملية مُتحكّمٌ بها من الواجهة الخلفية . 

راجع إجابة المدرب سامح في سؤالك السابق : 

 

  • 0
نشر
بتاريخ On 11/16/2021 at 19:54 قال Adnane Kadri:

كفكرة يمكنك تخزين أكثر من توكن واحد في مصفوفة JSON بداخل حقل token ، أين يمكنك التحقق من مطابقة التوكن اللذي يرسله المستخدم عن طريق متصفح ما مع أحد الرموز المخزنة بحقل token .

كيف هذا؟ وكيف سنعرف أن هاته المصفوفه أو تلك تخص هذا المتصفح او ذاك؟ وطبعا فإن عمود انتهاء الصلاحية يخزن مصفوفات أيضا أليس كذلك؟

 

بتاريخ On 11/16/2021 at 19:54 قال Adnane Kadri:

الاحتفاظ بتسجيل الدخول سيفرض تمديد المهلة الزمنية التي تنتهي فيها صلاحية التوكن

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

  • 0
نشر
بتاريخ On 11/17/2021 at 02:12 قال علي الكاسر:

كيف هذا؟ وكيف سنعرف أن هاته المصفوفه أو تلك تخص هذا المتصفح او ذاك؟ وطبعا فإن عمود انتهاء الصلاحية يخزن مصفوفات أيضا أليس كذلك؟

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

لاحظ : 

بتاريخ On 11/16/2021 at 19:24 قال Adnane Kadri:
  • يقوم العميل بإستقبال رد الخادم وتخزين هذا الـtoken ، يمكن تخزينه في التخزين المحلي LocalStorage أو عن طريق ملفات تعريف الإرتباط Cookies .  
  • في الطلبات القادمة سيتم قراءة الـ token من التخزين المحلي و إرساله مع الطلب . 
  • يقوم الخادم بالتحقق من وجود token مماثل مخزن وغير منتهي الصلاحية . يكون ذلك عن طريق التحقق من وجود السلسلة النصية التي يرسلها المستخدم بجدول المستخدمين ، وبمقارنة تاريخ إرسال الطلب بتاريخ إنتهاء صلاحية التوكين . 

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

  • user_id يمثل عمود id من جدول المستخدمين 
  • token يمثل رمز التوكين 
  • token_expires_at يمثل تاريخ إنتهاء صلاحية هذا التوكين  

ثم بدل التحقق من إمتلاك المستخدم لرمز token في عمود المستخدمين يتم ربط العملية بالجدول المنشئ حديثا. 

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

بتاريخ On 11/17/2021 at 02:12 قال علي الكاسر:

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

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...