سؤال

هذا السؤال لديه بالفعل إجابة هنا:

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

هل كانت مفيدة؟

المحلول

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

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

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

//check for cookie
if(isset($_COOKIE['remember_me'])) {
   // get hash and time stamp from cookie
   $hash = substr($_COOKIE['remember_me'],0,40);
   $last_visit = substr($_COOKIE['remember_me'],41);

   // query your db with $hash and $last_visit

   // if hash and time stamp match up
      // log in

      // store the current time stamp in a variable to use for both
      $time = date("Y-m-d H:i:s");
      // update the time stamp in your cookie
      $cookie = $pass . "-" . $time;
      setcookie('remember_me', $cookie, time()+60*60*24*100, '/');
      // update the time_stamp in your database
   else {
      // remove the remember me cookie
      setcookie('remember_me', '', time()-42000, '/')
   }

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

أوصي أيضًا بتسمية ملف تعريف الارتباط الخاص بك إلى جانب "remerce_me" لجعل من الصعب العثور عليها. على الرغم من أنه لا يضيف الكثير من الأمان ، إذا كان هناك أي شيء ، فإن تسمية ملف تعريف الارتباط "HT33424" يستغرق طالما تسميته "rememplication_me" أو "hack_me".

نصائح أخرى

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

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

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

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

على أي حال ، يعد الاحتفاظ بمعرف الجلسة أكثر أمانًا فقط وضع كلمة مرور SHA1 الخاصة بالمستخدم على ملفات تعريف الارتباط.

HMAC

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

يجب عليك إنشاء سلسلة عشوائية تصبح "مفتاحك السري" الخاص بك وعليك تخزينها على جانب الخادم (ربما في برنامج Config PHP كثابت) ولم تخبر أي شخص أبدًا. سأسمي هذا المفتاح السري SECRET_KEY.

ثم يجب أن يضع ملف تعريف الارتباط قيمتين:

  • USER_ID: معرف المستخدم للمستخدم الذي سيحصل على تسجيل الدخول التلقائي
  • HASH: تجزئة تشفير آمنة من USER_ID و SECRET_KEY. لذلك ، على سبيل المثال ، md5(USER_ID . "-" . SECRET_KEY). (شيء مختلف عن MD5 ، مثل SHA1 أو SHA256 مفضل).

لذلك يمكن أن يكون ملف تعريف الارتباط النهائي الخاص بك: USER_ID:HASH.

ثم ، عندما يتعين عليك التحقق مما إذا كان ملف تعريف الارتباط هو ملف تعريف ارتباط حقيقي ، عليك أن تفعل ذلك:

function isCookieGenuine($cookie_value) {
  list($value, $hash) = explode(':', $cookie_value, 2);

  if (md5($value . "-" . SECRET_KEY) == $hash)
    return true;
  else
    return false;
}

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

كما هو مذكور في التعليقات ، يمكنك القيام بذلك باستخدام hash_hmac وظيفة في php> = 5.1.2: http://us.php.net/manual/en/function.hash-hmac.php

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top