الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التأكد من تسجيل دخول واحد لنفس المستخدم

بدأه IsmSal في 12 نوفمبر 2008 · 17 رد · 1,843 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه

في البداية, اتوقع ان العنوان قد يكون غير كافي او غير مفهوم كفاية. لذلك سأصيغه بصيغة اخرى:

كيف يمكن الجزم ان عضو ما(محمد) قام بتسجيل الدخول لدى موقع و لا يوجد اي شخص اخر يقوم بتسجيل الدخول بنفس معلومات العضو (محمد)؟

مثال:

اذا افترضنا ان موقع ما يقدم خدمة معينة للزبائن, و قام عضو "محمد" بتسجيل الدخول في الموقع بالمعلومات التالية

اسم المستخدم : محمد و كلمة المرور : محمد 123

من ناحية اخرى, لدى محمد صديق مقرب اسمه "رشيد", و قام محمد سابقا باعطاء صديقه رشيد معلومات الدخول الخاصة بحسابه.

اذا عدنا للحظة تسجيل دخول محمد في الموقع المذكور سابقا, بعد برهة من الزمن قام رشيد بتسجيل الدخول في الموقع بنفس المعلومات الخاصة بمحمد.

كيف يمكن منع رشيد من تسجيل الدخول بينما محمد متصل بالموقع ومسجل دخوله ؟

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

نطمح ان نجد بعض الافكار و الاجابات لهذه المشكلة.

في النهاية, اعتقد ان الموضوع مفيد و مناسب للمواقع المتخصصة في مجال ما,و اهلا للنقاش.

IsmSalSig.gif

cpyright.jpg

#2

فكرتك جيدة واقتراح اضافة :

1- السؤال السرى فى حالة دخول اكثر من مستخدم

2- فى جدول الدخول

id date time ip

بحيث نعرف ال

ip

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

3- فى اول مرة نجد هذه المشكلة بأن يدخل مستخدم وهو اصلا تم دخوله فيجب فورا تغيير كلمة المرور وارسالها بالبريد الى المستخدم الاصلى

#3

السلام عليكم ،،

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

سارد علية باقرب وقت ممكن اذا لم يسبقني احد الاخوة الي الحل

لكن الحل له علاقة قوية بال Session management

تصبحون على خير

سبحان الله وبحمده *** سبحان الله العظيم

www.quraany.com

www.arabcs.com

#4

كل ما تريده يمكن عمله من خلال sessions

لكن ألا تجد أنك قد تحرم صاحب الحساب الدخول في حسابه أو حتى تحرمه الدخول من جهازين منفصلين (ربما نظامين حتى على نفس الحاسب) لسبب غير منطقي بالمرة؟

فكر بهذا.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

كما قال الاخوه سجل في سيشين او في ملف حتى تكست على السيرفير (بس لازم تحذفه بعد تسجيل الخروج)

------

طبعا هاتسجل في السيشين رقم الاي بي لانه هايكون الفيصل لمعرفه هل عضو اخر يدخل بالعضويه ام لا

#6

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

اقتباس
لكن ألا تجد أنك قد تحرم صاحب الحساب الدخول في حسابه أو حتى تحرمه الدخول من جهازين منفصلين (ربما نظامين حتى على نفس الحاسب) لسبب غير منطقي بالمرة؟

المدير يريد دخولا واحد لا أكثر مثل RapidShare .

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

#7

اولا اشكركم جميعا على مشاركتكم و ردودكم في الموضوع

ثانيا

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

بالنسبة للاخ XR.7 , فأنا انتظر الشرح من حضرتك و اتمنى ان يكون سهلا :)

بالنسبة للاخ Xacker اعتقد ان لكل نظام مقوماته و قوانينه او انظمته, فبنظري اي موفع متخخص يحرص على الا يكون هناك اكثر من دخول لنفس المستخدم في نفس الوقت, و كذلك قام الاخ SIFE بإعطائك مثال على ذلك وهو rapid share فهو موقع متخصص ...

IsmSalSig.gif

cpyright.jpg

#8

عزيزي..

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

الفكرة هي..

في جدول الاعضاء بقاعدة البيانات اضف حقل جديد وليكن اسمه "logged_in" واجعل القيمة الافتراضيه هي 0

وفي كل مرة يقم بتسجيل الدخول وبعد التحقق من المعلومات وان كانت قيمة logged_in مساوية للـ 0

عدلها وضع قيمة 1

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

ومع كل صفحه يزورها وقبل تسجيل الوقت الحالي في الجلسه، تطرح قيمة ال last_active الموجوده في session من الوقت الحالي.. وتقارن النتيجه مع الوقت الذي حددته سلفا وليكن 10 دقائق

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

فهي بالضبط مثل فكرة السيشن المؤقت.. مع إضافه بسيطه..

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

بالتوفيق

تم تعديل هذه المشاركة بواسطة DeaD SouL في 13 نوفمبر 2008 في 20:41

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#9

السلام عليكم،

فكرة جيدة أخي DeaD SouL.

شكراً.

#10

شكر كبير لأخي DeaD SouL على الشرح و ياحبذا لو يدعم بمثال او تطبيق عملي :) (اعذرني قد يكون طلب ثقيل نوعا ما)

IsmSalSig.gif

cpyright.jpg

#11

اعزائي..

لا شكر على واجب..

في الشرح العملي.. تظهر العيوب..

وعند الحديث النظري.. نسيت ان الجلسه خاصه

بكل مستخدم.. ولا يمكن التأكد من جلسة عضو عن طريق عضو اخر..

مثال للتوضيح.. ان سجل احمد الدخول ووضعنا جلسه باسم last_active

فلن نستطيع التأكد من وجود او خلو جلسة احمد ان حاول شخص اخر بتسجيل الدخول بنفس العضوية..

لذلك اجريت التعديل التالي.. وهو وضع حقل في القاعدة باسم last_active من نوع int عوضا عن logged_in

ولكي نقلل من الاستعلام عن نفس الجدول.. ندخل معها الجلسات..

ففي بدايه كل صفحة نضع التالي قبل اي كود

session_start();

وفي صفحة تسجيل الدخول وبعد التأكد من صحة البيانات المدخله

// في صفحة تسجل الدخول وعند التأكد من صحة البيانات المعطاة
// نستعلم عن الوقت الموجود بالحقل last_active
// $db_last_active = قيمة الوقت من القاعده
If( (time() - $db_last_active) > (10*60) ) {
	// نقوم بتسجيل جلسة جديده تحتوي على الوقت الحالي مع تعديل قيمة حقل القاعده الى الوقت الحالي
} Else {
	// نعتذر للعضو الذي اراد تسجيل الدخول والسبب وحود عضو مسجل وهو نشط في الوقت الحالي بنفس العضوية
}

وفي بداية كل صفحة

// نتأكد من التالي في بداية كل صفحة
// ان كانت الجلسة موجوده.. فان هذا هو العضو الذي قام بالتسجيل اولا لذلك نتأكد من الوقت الذي غابه
If(isSet($_SESSION['last_active'])) {
	// نتأكد من ان القيمة عدديه
	$_SESSION['last_active'] = (int) $_SESSION['last_active'];
	//ان كان فرق الوقتين اكبر من 10 دقائق
	If( (time() - $_SESSION['last_active']) > (10*60) ) {
		// نقوم بحذف الجلسه وتعيين قيمة حقل ال last_active 0 او تركها كما هي ويستحسن تغييرها
	} Else {
		// نقوم تعيين الوقت الحالي في كلا من الجلسه وحقل القاعده (last_active)

	}

} Else {
	// نقوم باستعلام من القاعده عن الوقت
	// $db_last_active = قيمة الوقت من القاعده
	If( (time() - $db_last_active) > (10*60) ) {
		// نقوم بحذف الجلسه وتعيين قيمة حقل ال last_active 0 او تركها كما هي ويستحسن تغييرها
	} Else {
		// نقوم تعيين الوقت الحالي في كلا من الجلسه وحقل القاعده (last_active)
	}

}

ارجو ان يكون المثال والشرح واضح

بالتوفيق

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#12

تحية اليك اخي الحبيب على تفاعلك مع الموضوع ومشاركتك

لكن اعذرني لن استطيع حاليا تجربة الكود لاسباب خاصة, لكن حينما اجربه سأخبرك بالتأكيد.

شكرا لك مرة اخرى و لجميع من شارك بالموضوع ولو بفكرة

IsmSalSig.gif

cpyright.jpg

#13

عزيزي

الشكر لله.. ولم افعل شيء فكلنا كنا في وقت من الاوقات لا نعلم شيء

بالتوفيق وننتظر النتيجه

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#14

السلام عليكم ،،

الحل الذي قدمه اخي DeaD SouL ممتاز ... لكن عندي حل اخر استخدمه ويفيد في عده امور ،،،

لكي نفهم فكره الحل علينا معرفه التالي

1- ان كل زائر له Session خاص يحمل قيم مسجله من قبل صفحات ال PHP لا يستطيع اي Session اخر قرائتها

2- ان تطبيقات ال WEB عباره عن صفحات كل صفحه برنامج مستقل لا يعرف الصفحه الاخرى

3- ان صفحات ال WEB تتبادل البيانات بينها لكل Session عن طيق ال Session Variables

4- ان ال Session له عمر محدد يعرف في اعدادت الخادم عادتا ما يكون 20 دقيقه ، وتحسب من وقت اخر زياره لاخر صفحه

بعد هذا الوقت يمسح ال Session وجميع القيم المتعلقه به مما يظطر الزائر لاعاده التسجيل

5- لو اردنا ان نجعل كل ال Sessions الحاليه تقراء و تكتب على مكان مشترك ولا يتدخل به اي برنامج اخر غير تطبيق ال WEB الخاص بنا

فكل ماعلينا هو استخدام ال GLOBAL Variables

والان بعد ان تعرفنا على بعض خصائص ال WEB التي تؤثر في مشكلتنا وحلها

علينا تحليل المشكله كالتالي:

1- اذا اردنا معرفه كل الاعضاء الذين سجلو دخولهم كل ماعلينا هو تسجيل بيانات كل عضو بعد اتمام عمليه التسجيل مباشره في GLOBAL Variable

2- لكي تكون بيانات الاعضاء الذين سجلو الخول صحيحه علينا حذف كل عضو سجل الخروج

3- تظهر هنا مشكله ، وهي ان هناك اعضاء لم يسجلوا الخروج لكنهم اغلقوا المتصفح او تركوه وانصرفوا ...

وهؤلاء لايمكننا معرفهم الا من خلال الوقت المحدد لكل Session فإذا تعدى اي عضو ال 20 دقيقه بدون ان يسجل خروجه او ان يزور اي صفحه هنا يجب ان نحذفه من القائمه المحفوظه في ال GLOBAL Variable

4- حينما يسجل اي عضو الدخول يجب ان لا يكون مسجل في ال GLOBAL Variable وبذلك نظمن عدم الدخول مرتين في وقت واحد

ومن مميزات هذه الطريقه انها

1- لو اعيد تشغيل السيرفر تبداء من جديد وكل الاعضاء يستطيعون التسجيل

2- تقلل الاستعلام من قاعده البيانات بشكل كبير

3- ممكن استخدام جدول المستخمين نفسه لاكثر من تطبيق (وهذه مهمه للشركات )

وامور اخرى ،،،

اعلم انني لم اوضح بتفصيل اكثر لكن رجائي انكم اخذتم الفكره

من واقع خبره .. الافكار تبقى والامثله تتبخر :)

سبحان الله وبحمده *** سبحان الله العظيم

www.quraany.com

www.arabcs.com

#15

طريقة جميلة أخ XR.7

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

لدى حل أخر يعتمد فى الاساس على استخدام Cookies

  1. فى جدول Users الذى يحتوى اسم المستخدم وكلمة المرور ، نضيف حقل اسمه مثلا (RndNumber).
  2. عند دخول المستخدم ، تقوم بتوليد رقم عشوائى وتخزنه فى حقل RndNumber الخاص بهذا المستخدم.
  3. بعد دخول المستخدم ترسل له مع ال cookies نفس الرقم العشوائى RndNumber.
  4. عند تسجيل خروج المستخدم او انتهاء الsession الخاصه به، تضع فى الحقل RndNumber الخاص بهذا المستخدم القيمة 0 (القيمة 0 فى هذا الحقل تعنى أن هذا الحساب غير مستغل offline الأن).
  5. الملخص: اذا كان RndNumber = 0 : المستخدم غير موجود اما اذا كان RndNumber لا يساوى 0 : المستخدم موجود.

ندرس الحالات التالية:

  1. دخل محمد وتم توليد الرقم العشوائى 124578 فى الحقل RndNumber الخاص به ، وتم تخزينها عنده فى cookie.
  2. حاول شخص أخر الدخول من جهاز أخر: سيرسل لك اسم المستخدم وكلمة المرور والcookie سترسل لك اخر قيمة عشوائية مخزنة عنده، او لن ترسل شيئ اذا لم يكن عنده cookie، وهنا يمكن ان يكون كود التحقق بالشكل الاتى
  3. $username = $_POST['Username'];
  4. $password = $_POST['Password'];
  5. $rndNumber = $_COOKIE['RndNumber'] != '' ? $_COOKIE['RndNumber'] : '0';
  6.  
  7. $query = "SELECT * FROM UsersTable WHERE Name='".$username."' AND Password='".$password."' AND
    (RndNumber=0 OR RndNumber=".$rndNumber.")";
  8.  
  9.  

  • الشخص الجديد لن يستطيع الدخول اثناء استخدام هذا الحساب. لأن RndNumber غير متطابق.
  • اذا اغلق المتصفح الخاص بصاحب المعرف الاصلى لأى سبب، قبل انتهاء ال session ، لن يضطر للانتظار 20 دقيقة، لأن ال RndNumber عنده (الذى سيأتى مع ال cookie) سيطابق الموجود فى قاعدة البيانات ويستطيع الدخول.
  • ملاحظة: لا تعتمد على IP المستخدم فى اى تحقق، لأن اعادة تشغيل ال adsl او عمل اعادة اتصال من الموديم سيعطيه رقم جديد لنفس المستخدم، من جهة اخرى وكما ذكر الاخ SIFE قد يكون اكثر من مستخدم فى نفس الشبكة من وراء بروكسى

    :)

    تم تعديل هذه المشاركة بواسطة دحدوح في 15 نوفمبر 2008 في 12:38

    #16

    شرح جميل ووافي للاخين XR.7 و دحدوح

    لكن يبدو ان لكلا الحلين مشكلة او عيب

    اقتراح الاخ XR.7 كما قال الاخ دحدوح :

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

    و كذلك في اقتراح الاخ دحدوح , ماذا اذا كان المستخدم (المتصفح)يمنع استخدام Cookies؟

    ما رأيكم؟؟؟؟؟؟

    IsmSalSig.gif

    cpyright.jpg

    #17
    IsmSal كتب:
    و كذلك في اقتراح الاخ دحدوح , ماذا اذا كان المستخدم (المتصفح)يمنع استخدام Cookies؟

    ما رأيكم؟؟؟؟؟؟

    فى هذه الحالة (عندما تكتشف ان المتصفح يمنع استخدام Cookies) ، تظهر له رساله تفيد أنه عند اغلاق الموقع دون الخروج منه لأى سبب ، فإنك لن تستطيع معاودة الدخول مرة أخرى الا بعد 20 دقيقة، إذا اردت تجنب الانتظار 20 دقيقة ، اسمح بأستخدام Cookies.

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

    #18

    السلام عليكم ،،

    اشكر الاخوه علئ النقاش الجميل

    اخواني انتظار المستخدم 20 دقيقه اذا اغلق المتصفح بالخطا افضل من ان يدخل اي شخص اخى بحسابه اذا اغلق المتصفح دون تسجيل الخروج ،، وهذا مايحدث في تطبيقات ال Internet Banking

    سبحان الله وبحمده *** سبحان الله العظيم

    www.quraany.com

    www.arabcs.com

    مواضيع مشابهة