فكرة لزر تذكرني عند صنع نظام تسجيل الدخول في php

السلام عليكم

رمضان كريم

اليوم كنت أعمل على نظام تسجيل دخول و اردت اضافة خاصية تذكر المستخدم له

أعتقد ان الطريقة المستخدمة هي: تخزين اسم المستخدم و كلمة المرور في الكويكز

لاكن اعتقد هذه الطريقة سيئة من ناحية الحماية! و سنقع في ثغرة سخيفة شبيهة بثغرة session hijacking

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

فأليكم ما فكرت به:

عندما يدخل المستخدم نقوم بتخزن الsession id في الكويكز

setcookie("remember_me", session_id(), time() + (86400*30), '/');

وعلى فرض اقفل المستخدم المتصفح و اعاد فتحه فسيتم تسجيل الخروج تلقائياً و يتغير الsession id الخاص به

و ولذلك نحن الآن سنعمل على إعادة الجلسة له لذلك سنقوم بستدعاء الكويكز الذي قمنا بحفظه بالكويكز و نستبدله بالsession id كالتالي:

setcookie(session_name(), $_COOKIE['remember_me'], 0, '/');

جربت الطريقة و نجحت عندي!

لكن انا لا اعرف إذا كانت الطريقة ناجحة .. ربما php تقوم بحذف الsession تلقائياً بعد مدة من نسيانها !

يرجى من الخبراء إخباري عن الطريقة هل ستكون ناجحة أم لا ..

و ما هي طرق حماية الكويكز في الphp , هل استخدام قواعد البيانات أفضل في حماية الكويكز ؟

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

ولما لاتستخدم session ؟ 

session_start();
$_SESSION["remember_me"] = $userData;

ملاحظة الsession id يتغير كل مرة

ولاتتأكد من أن المعلومات موجودة فقط بل التأكد من خلال قاعدة البيانات أكثر امانًا .

الsession ستحذف من متصفح المستخدم عندما يغلقه !

أنا اريد ان اقوم بحفظ المستخدم او تذكره

ما اقصده في حال أراد المستخدم البقاء متصلاً و عدم كتابة اسم المستخدم و كلمة المرور في المرات القادمة ( ك حسوب مثلا )

لانك الوقت الاقصى لها ينتهي انظر هنا

session.gc_maxlifetime تكون تقريباً 24 دقيقة

هذا يعني ان الطريقة ستفشل في حفظ الجلسة

شكراً لك

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

مثال: بعد نجاح التحقق في تسجيل الدخول يكون لدينا التالي:

// $_POST['remember'] هي عبار عن checkbox
// إذا كان التشاكبوكس فعال فإن عمر الكعكة سيكون عام كامل، إذا لم يكن فعال فسيكون عمر الكعكة يوم واحد
// يمكنك التحكم في عمر الكعكة بتعديل الأرقام
$remember_me = isset($_POST['remember']) ? time()+86400*365 : time()+86400;

// $_SERVER['HTTP_USER_AGENT'] هي قيمة خاصة في كل متصفح لكل مستخدم لذا ستساعدنا كثيرا في تجنب سرقة الجلسة
// ملاحظة قيمة $password يجب أن تكون مشفرة مثل الموجودة في قاعدة البيانات
$login_hash = hash('sha512', $password.$_SERVER['HTTP_USER_AGENT']);

// وضع الكعكات والتحويل للوحة التحكم
setcookie("username", $username, $remember_me, '/', '', 0);
setcookie("login_hash", $login_hash, $remember_me, '/', '', 0);

يتم التحقق من تسجيل الدخول عن طريق:

// جلب كلمة المرور المستخدم من قاعدة البيانات عن طريق المعرف username الذي سبق ووضعناه
$checked_hash = hash('sha512', $user->password.$_SERVER['HTTP_USER_AGENT']);
// التحقق من أن الهاش السابق هو نفسه هاش التحقق
if( $checked_hash === $_COOKIE['login_hash'] ) { // user logged in }else{ // not logged in }

عند تسجيل الخروج:

session_unset();
session_destroy();
setcookie('username', '', time()-86400*365, '/', '', 0);
setcookie('login_hash', '', time()-86400*365, '/', '', 0);

بالتوفيق

مشكور على الرد و الشرح الجميل

وصلت الفكرة

و هي باستخدما $_SERVER['HTTP_USER_AGENT'] و تشفيرها مع كلمة المرور و اسم المستخدم و عند الرجوع سيتحقق من قيمة HTTP_USER_AGENT