النتائج 1 إلى 12 من 12

الموضوع: كيف نتجنب الأخطاء في session

  1. #1
    عضو فعال جدا
    تاريخ التسجيل
    Sep 2000
    المشاركات
    2,029

    كيف نتجنب الأخطاء في session



    سلام عليكم

    قمت منذ قليل، ببرمجة نظام حماية للوحة تحكم، تعتمد على تسجيل جلسة إذا كانت البيانات المدخلة من قبل المستخدم صحيحة وتطابق ما يوجد في قاعدة البيانات (الاسم وكلمة السر) فإذا كانت صحيحة، أقوم بتسجيل متغير هكذا:
    كود PHP:
    $login "true";
    session_register('login'); 
    ثم تقوم كافة صفحات لوحة التحكم بالتأكد من أن متغير الجلسة login مسجل وموجود، فإذا لم يكن موجوداً فإنها ترسل المستخدم إلى نموذج خاص بإدخال الاسم وكلمة السر، وهذا النظام بسيط ويعمل بشكل جيد، لكن ما أريد معرفته، هو:

    1) هل هذا النظام كافي لمنع من يريد التسلل إلى لوحة التحكم؟

    وهناك أسئلة أخرى:
    2) كيف نتجنب الأخطاء عند حماية لوحة التحكم؟ أعني هل هناك أخطاء معروفة يقع فيها البعض ويمكن تجنبها بأسلوب معين؟

    3) كيف نستفيد من أوامر الجلسات بشكل فاعل؟
    فأنا لم أستخدم من أوامر الجلسات إلا:
    كود PHP:
    session_start()
    session_register('var')
    session_destroy() 
    فهل هذا كافي لحماية لوحة التحكم؟ أريد إجابة كافية حول كيفية حماية الصفحات عن طريق php "فقط"





    سردال غير متواجد حالياً


  2. #2
    عضو نشيط
    تاريخ التسجيل
    May 2002
    المشاركات
    137


    ليس هذا كافياً بالتأكيد..
    توجد بعض الاعتبارات سأسرد ما أتذكره الآن، وفيها جواب لأسئلتك الثلاثة:

    - يجب أن تختار إما أن تقوم الجلسات على اسلوب اعتماد البصمة (Cookie) ففي هذه الحالة لا بد من أن تقوم بتهيئة التالي:
    كود PHP:
    // استخدام البصمات cookyes
    ini_set("session.use_cookyes"1);

    // عدم استخدام معرف الجلسة في العنوان
    ini_set("session.use_trans_sid"0);

    // تحديد مستوى الحماية للجلسة 
    // إلى مستوى الخصوصية بالنسبة للمستخدم الواحد
    session_cache_limiter('private'); 

    // بدء الجلسة
    session_start(); 
    للمزيد من المعلومات راجع:
    http://www.php.net/session_get_cookie_params

    وإما أن تقوم الجلسات على اسلوب اعتماد معرف الجلسة SID ففي هذه الحالة لا بد من أن تقوم بتهيئة التالي:
    كود PHP:
    // عدم استخدام البصمات Cookies
    ini_set("session.use_cookyes",0);
    // استخدام معرف الجلسة
    ini_set("session.use_trans_sid",1);
    // التأكد من مصدر القدوم
    // قم باستبدال host/path
    // ليكون مصدر القدوم هو من موقعك نفسه
    ini_set('session.referer_check'"host/path"); 
    وكذلك قد يكون من الجيد أيضاً أن تتأكد من عنوان IP الداخل لبداية الجلسة بحيث تتأكد من أي عملية تغير لعنوان IP قد يكون سببها وجود دخيل، كأن تقوم بحفظ عنوان IP المستخدم عند تسجيل دخول، ومقارنة عنوان IP المسجل عند الوصول إلى كل صفحة.

    - عليك أن تتأكد أيضاً من متغير الجلسة بالاسلوب:
    كود:
     if ($HTTP_SESSION_VARS['login']) ...
    وليس
    كود:
    if ($login) ..
    فهذا خطأ شائع..






    __________________
    visualmind (at) php.net
    أعتذر كثيراً عن غيابي من المشاركات والذي لن يطول أكثر إن شاء الله.
    VisualMind غير متواجد حالياً

  3. #3
    عضو نشيط
    تاريخ التسجيل
    Jul 2002
    المشاركات
    172


    أهلين فيك اخي سردال ..
    كيف حالك
    عندي إضافة لما قاله الأخ VisualMind
    --------------------------
    هناك دوال أخرى جيدة للاستخدام ايضا ً كما ذكرت ..
    هناك session_encode
    وهي لقراءة المتغيرات المحفوظة في الجلسات
    مثلا ً قمت بتخزين اسم مستخدم في السيزون
    وأردت تعريفه بهذه الدالة ..
    مثال :
    كود PHP:
    <?
    session_start
    ();
    session_register("name");
    $name "Serdal";
    $encode session_encode();
    print 
    "$encode";
    ?>
    --------
    هناك نقطة وهي نقطة تسجيل الخروج نسيت دالة مسح الجلسة وهي
    session_unregister
    --------

    شكرا ً على موضوعك الجميل
    وسلامي لك





    __________________

    ****************************
    Danger For Make Dreams
    ****************************
    alkha6ar غير متواجد حالياً

  4. #4
    عضو نشيط
    تاريخ التسجيل
    May 2002
    المشاركات
    137


    يجب أن تقوم بالتنبيه حول عملية الخروج فحين تحدث عملية الخروج قم بالتغيير كما في المثال التالي:
    كود:
    $login = false;
    sessnion_unset();
    بدلاً من الاكتفاء بهذا
    كود:
    $login = false;
    فهذا خطأ شائع آخر.

    كما من الأفضل أيضاً التأكد من عملية إنهاء الجلسة تلقائياً بالتأكد من قيم session.gc_maxlifetime و session.gc_probability

    --تنبيه: يبدو أن هناك كود في المنتدى يقوم تلقائياً بتحويل كلمة coo kie إلى cookye لذلك وجب التنبيه لهذا الخطأ في منتدى سوالف





    __________________
    visualmind (at) php.net
    أعتذر كثيراً عن غيابي من المشاركات والذي لن يطول أكثر إن شاء الله.
    VisualMind غير متواجد حالياً

  5. #5
    عضو نشيط
    تاريخ التسجيل
    May 2002
    المشاركات
    137


    عفواً، لم أنتبه إلى ردك أخي alkha6ar يبدو أنن كنا نكتب في نفس الوقت، شكراً لك

    أود أن أعلق أن استخدام session_unregister غير كاف، فلا بد من تغيير قيمة المتغير أيضاً، والأفضل فعلياً أن يتم استخدام الطريقة التي ذكرتها في ردي أعلاه.

    كما أنه في الواقع توجد العديد من اساليب استخدام الجلسات، فكما ذكر alkha6ar حول استخدام دالة session_decode، لذلك من الأفضل مراجعة الموقع: http://www.php.net/manual/en/ref.session.php بشكل كامل لمعرفة العديد من الأفكار الأخرى.





    __________________
    visualmind (at) php.net
    أعتذر كثيراً عن غيابي من المشاركات والذي لن يطول أكثر إن شاء الله.
    VisualMind غير متواجد حالياً

  6. #6
    عضو نشيط
    تاريخ التسجيل
    Jul 2002
    المشاركات
    172








    __________________

    ****************************
    Danger For Make Dreams
    ****************************
    alkha6ar غير متواجد حالياً

  7. #7
    عضو فعال جدا
    تاريخ التسجيل
    Sep 2000
    المشاركات
    2,029


    جزاكم الله خيراً ما قصرتوا

    لكن شوي شوي، مبتدأ صدقوني وأحاول أتعلم ، شخصياً أستعمل:
    كود:
    if ($_SESSION['login']) {
    وأعتقد هذه تشبه التي كتبتها أخي VisualMind:
    كود:
    if ($HTTP_SESSION_VARS['login']) ...
    وإن شاء الله أطبق ما كتبتموه وأرجع لكم إن كان لدي أية استفسارات، وبالنسبة لمشكلة كلمة cookies فأعتقد أنها حلت





    سردال غير متواجد حالياً

  8. #8
    عضو نشيط
    تاريخ التسجيل
    May 2002
    المشاركات
    137


    مرحباً أخي سردال،
    العبارة التي تستخدمها صحيحة، انا استخدمت الطريقة المطولة بينما تغني الطريقة المختصرة عنها (إذا كنت تستخدم إصدار PHP 4.1 أو أعلى) وطريقتك أصح.

    شكراً لحل موضوع كلمة cookie، هل بالإمكان أيضاً حل مشكلة عرض كود php من اليمين إلى اليسار؟ بحيث يصبح الاتجاه dir=ltr





    __________________
    visualmind (at) php.net
    أعتذر كثيراً عن غيابي من المشاركات والذي لن يطول أكثر إن شاء الله.
    VisualMind غير متواجد حالياً

  9. Question



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

    حيث اني استخدمت الجلسة بالطريقة .
    تسجيل الجلسة اذا كان اسم المستخدم و الرقم السري صحيح . و تخزين القيمة 1 او اي قيمة تثبت ان الاسم صحيح . و حين رغبته في الخروج يكون
    session_unregister

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

    كود PHP:
    // استخدام معرف الجلسة
    ini_set("session.use_trans_sid",1); 
    اذا ممكن شوي تفصيل فيها اخوي صلاح و مشكور مقدماً .

    تحياتي اخوكم ابو مشعل





    __________________
    أخوكم ابو مشعل
    ملاحظات لتنظيم المنتدى:
    http://www.swalif.net/softs/showthread.php?s=&threadid=42612
    ---------------
    ابو مشعل غير متواجد حالياً

  10. #10
    عضو نشيط
    تاريخ التسجيل
    May 2002
    المشاركات
    137


    حياك الله يا أبا مشعل،
    أولاً، أنا ذكرت أن استخدام session_unregister غير كافِ لأنه يقوم بإزالة تعيين المتغيرات ضمن متغيرات الجلسة ولكنه لا يقوم بإزالة قيمتها ما لم تقم بذلك بنفسك كأن تستخدم unset

    ثانياً، بالنسبة للإضافة التي كتبتها بخصوص session.use_trans_id وذلك لأن إعدادات php الافتراضية تقوم باستخدام الجلسة عن طريق البصمة Cookie، حيث تقوم بتخزين معرف الجلسة (الكود الطويل المكون من مجموعة من الحروف وأرقام) داخل متغير Cookie في جهاز المستخدم دون أن يلاحظ المستخدم ذلك وهو متغير بصمة مختلف تماماً عن تلك التي يمكن تكوينها باستخدام setcookie والسبب في أنه حساس بالنسبة للمستعرض فقد يفقد بسرعة إذا وجد المستعرض أو المزود أن شيئاً ما حدث (تغير الاتصال، إقفال نوافذ المتصفح، تغيير رقم IP بشكل ملفت، الوصول إلى الصفحة من مكان غير متوقع أو تلاشي قيمة REFERRER.. وغيرها) وعندما يفقد فإنه سيعتبر المستخدم في جلسة جديدة ويستخدم معرف جلسة جديد) وهذا هو أحد الأسباب الذي يجعل التصفح في سوالف مثلاً من قبل أنواع من المستعرضات أو أولئك الذين يستخدمون موجوعة متوالية من الملقمات الوكيلة Proxies يسبب طلب اسم المستخدم وكلمة المرور بشكل متكرر نظراً لفقدان معرف الجلسة في متغير البصمة الحساس).
    وهذا وإن كان يبدو أنه يعمل بشكل جيد، إلا أنه قد يواجه بعض المستخدمين مشاكل في ذلك كما ذكرت آنفاً، لذلك فإن أصررت على استخدامه فعليك أن تقوم بتهيئة PHP ليعامله معاملة خاصة وهي أن تقول:
    كود PHP:
    // استخدم متغير البصمة لتخزين معرف الجلسة
    ini_set("session.use_cookies"1);

    // عدم استخدام معرف الجلسة في العنوان
    ini_set("session.use_trans_sid"0);

    // تحديد مستوى الحماية للجلسة 
    // إلى مستوى الخصوصية بالنسبة للمستخدم الواحد
    // حتى تكسب متغير الجلسة الحساسية التي تجعله آمناً بالنسبة للمستخدم الواحد
    session_cache_limiter('private'); 
    وهذه الإعدادات هي في العادة موجودة مسبقاً كإعدادت افتراضية default

    أما إذا كنت لا تريد أن تستخدم متغير البصمة إياه حتى تجعل التصفح عبر موقعك مستقراً ولا يتأثر بالمستعرض أو المزود أو الملقمات الوكيلة، ولا تريد أن تجعل مستخدميك يفقدون جلساتهم خلال التصفح فإنك يجب أن تتوقف عن استخدام متغير البصمة وتستخدم معرف الجلسة التي يتم انتقاله عبر العنوان عادة كما في الشكل:
    كود:
    url?si=ced3fecabcfee3798dceaf
    لذلك عليك أن تقوم بإعداد PHP لذلك فتكتب:
    كود PHP:
    // توقف عن استخدام متغير البصمة للجلسة
    ini_set("session.use_cookies",0);
    // استخدام معرف الجلسة
    ini_set("session.use_trans_sid",1); 
    والذي سيجعل PHP يقوم بوضع معرف الجلسة مع كل ارتباط في صفحاتك تلقائياً، وكذلك أيضاً في النماذج حتى يجعل التصفح يقوم بتناقل معرف الجلسة من صفحة إلى أخرى تلقائياً.
    ولأن استخدام معرف الجلسة ليس آمناً تماماً، إذا أنه تخيل أن شخصاً قام بنسخ عنوان ما من صفحته بعد دخوله فيها وأعطاها لصديق له عبر المسنجر مثلاً فذلك سيجعل كلا الصديقين يدخلان نفس الموقع باستخدام نفس الجلسة، وما كان للزائر الأول سيكون للثاني (صلاحيات المستخدم مثلاً) لذلك يجب أن تقوم بوضع احتياطات تمنع ذلك، كأن تقول:
    كود PHP:
    // التأكد من مصدر القدوم
    // قم باستبدال host/path
    // ليكون مصدر القدوم هو من موقعك نفسه
    ini_set('session.referer_check'"host/path"); 
    وهذا يمنع حدوث مثل تلك الحالة حيث يقوم PHP تلقائياً بالتأكد من أن معرف الجلسة آت من صفحة سابقة في نفس الموقع، وإلا فإنه سيقوم بتكوين جلسة جديدة للزائر الآخر.
    كما أنك قد تحتاج أيضاً لزيادة في الحرص أن تقوم بتدوين رقم IP الزائر عند الدخول وبداية الجلسة، وتقوم بالتأكد من أنه نفس الرقم (أو مقارب له) عند الانتقال من صفحة إلى أخرى لتمنع وجود دخيل يستخدم نفس معرف الجلسة بأسلوب أو بآخر.

    مرة أخرى، أتمنى أن تقوموا بتصحيح وضع كود php داخل المنتدى بأن تستخدم dir=ltr للكود، إذ أن شكل الكود من اليمين إلى اليسار مزري كما أرى، وشكراً لكم





    __________________
    visualmind (at) php.net
    أعتذر كثيراً عن غيابي من المشاركات والذي لن يطول أكثر إن شاء الله.
    VisualMind غير متواجد حالياً



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

    تحياتي
    اخوك
    ابو مشعل





    __________________
    أخوكم ابو مشعل
    ملاحظات لتنظيم المنتدى:
    http://www.swalif.net/softs/showthread.php?s=&threadid=42612
    ---------------
    ابو مشعل غير متواجد حالياً

  12. #12
    عضو نشيط
    تاريخ التسجيل
    May 2002
    المشاركات
    137


    آمين،
    شكراً لك يا أبو مشعل





    __________________
    visualmind (at) php.net
    أعتذر كثيراً عن غيابي من المشاركات والذي لن يطول أكثر إن شاء الله.
    VisualMind غير متواجد حالياً





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض