نمایش نتایج 1 تا 2 از 2

نام تاپیک: چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ?

  1. #1
    کاربر تازه وارد آواتار دکمه64
    تاریخ عضویت
    آبان 1387
    محل زندگی
    شیراز
    سن
    39
    پست
    39

    چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ?

    سرفصل‌ها :
    1ـ اين اسكريپت چگونه كار مي كند | پيشنيازها | الگوي بانك اطلاعاتي
    2ـاتصال به بانك اطلاعاتي |‌ متغيرهاي جلسات
    3ـ هسته اسكريپت | ورود كاربران
    4ـكنترل مداوم اعتبار ورود | اطمينان از معتبر بودن اطلاعاتجلسات


    اينآموزش در سطح متوسط طراحي گرديده و به شما خواهد آموخت كه چگونه يك برنامه لاگينامن و حرفه اي طراحي كنيد . بزودي ياد مي گيريم كه چگونه با استفاده از توابع كوكيها دسترسي به جلسات را قانوني كنيم و از سرقت جلسات جلوگيري كنيم.

    1ـ ايناسكريپت چگونه كار مي كند ؟
    در اين قسمت مي خواهم برايتان دليل انتخاب اين متدبراي لاگين امن را برايتان توضيح دهم فراموش نكنيد كه اصولا امنيت قانون ندارد وشما نيز با استفاده از تجربيات و توانايي هاي هوشي خود بايد به فكر توسعه و طراحيموارد مشابه و امن تر نمائيد و به هيچ وجه به اين حد بسنده نكنيد:
    /tmpكاربرانيكه قادرند تا به سرور دست يابي داشته باشند مي تواند جلسات معتبر لاگينها را ازشاخه پيش فرض
    كه به منظور ذخيره سازي اطلاعات جلسات استفاده ميشود مشاهده نمايندروش جلوگيري از اين نوع حمله كنترل آي پي مي باشد.
    كساني كه بر روي ميزبان شماسايتي دارند قادرند جلسات معتبر براي سايت شما توليد كنند توجه بفرمائيد كه برخيسايتها سرورهاي اختصاصي دارند كه به لحاظ امنيتي بسيار مطلوبترند مثل سايت پرشينبلاگ
    برخي از اون آدمايي كه به قول خودمون آخرشن و اند حكن مي تونن شبكه رو بوبكشن و كوكي‌ها رو بقاپن
    كنترل آي پي اين مشكل رو هم حل مي كنه

    2-1ـ اماپيش نيازها
    شما اول از همه بايد بدونين كه چه اطلاعاتي از كاربران قرار كه درسايت ذخيره بشه در اين مثال براي سهولت آموزش ساده ترين شكل ممكن رو فرض قرار دادمضمنن چون الان همه ديگه پي اچ پي 4.1 به بالا دارن من هم از استفاده كردم اگر ميخواين كه اين اسكريپت رو روي نسخه هاي قديمي تر اجرا كنين شما super global arrays
    مجبوريد كه از
    $GLOBALS['HTTP_SESSION_VARS']
    استفادهكنيد.

    الگوي بانك اطلاعاتي ـ1-3
    اين فقط يك مثال ساده با ساختاري مناسببراي مديريت اگر كه مايليد اين مثال را براي كاربران ثبت نام شده استفاده كنيد ميتوانيد ستونهاي را به دلخواه اضافه كنيد
    من الگوي بانك اطلاعاتي را كه از ماي اسكيو ال استفاده مي كنه اينجا گذاشتم شما مي تونين از ديگر بانكهاي اطلاعاتي نيزاستفاده كنيد:
     

    CREATE TABLE member (


    id int NOT NULL auto_increment,


    username varchar(20) NOT NULL default '',


    password char(32) binary NOT NULL default '',


    cookie char(32) binary NOT NULL default '',


    session char(32) binary NOT NULL default '',


    ip varchar(15) binary NOT NULL default '',


    PRIMARY KEY (id),


    UNIQUE KEY username (username)


    );





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

    ـــــــــــــــــــــــــ ـــــــــــــ
    2ـاتصال به بانك اطلاعاتي

    function &db_connect() {



    require_once 'DB.php';



    PEAR::setErrorHandling(PEAR_ERROR_DIE);



    $db_host = 'localhost';


    $db_user = 'root';


    $db_pass = '';


    $db_name = 'shaggy';



    $dsn = \"mysql://$db_user:$db_pass@unix+$db_host/$db_name\";



    $db = DB::connect($dsn);



    $db->setFetchMode(DB_FETCHMODE_OBJECT);


    return $db;

    }





    اين تابع شما را به بانكاطلاعاتي متصل مي كند و يك اشاره گر به شي بانك اطلاعاتي پير باز ميگرداند

    2-2ـ متغيرهاي جلسات:
    براي سهولت در امر دستيابي به اطلاعاتكاربران من اون رو يك متغير جلسه ثبت مي كنم ولي براي جلوگيري از پيغام خطا وهمچنين ست كردن برخي پيش فرض ها از تابع زير استفاده مي كنم:

     

    function session_defaults() {



    $_SESSION['logged'] = false;


    $_SESSION['uid'] = 0;


    $_SESSION['username'] = '';


    $_SESSION['cookie'] = 0;


    $_SESSION['remember'] = false;


    }



    براي ست كردن يه مقادير پيش فرض ازتابع بالا و براي چك كردن از تابع زير
     

    if (!isset($_SESSION['uid']) ) {


    session_defaults();


    }



    رو فرا خوانيكنيمsession_startالبته فراموش نمي كنيم كه قبل از اينها بايد تابع

    3ـ هستهاسكريپت:
    براي ايجاد يكپارچگي ساده تر با ديگر اسكريپتها و ساخت مدوله شده ترهسته اسكريپت رو يك آبجكت با ظاهري خيلي ساده مي سازم
     

    class User {



    var $db = null; // PEAR::DB pointer


    var $failed = false; // failed login attempt


    var $date; // current date GMT


    var $id = 0; // the current user's id



    function User(&$db) {



    $this->db = $db;


    $this->date = $GLOBALS['date'];



    if ($_SESSION['logged']) {


    $this->_checkSession();


    } elseif ( isset($_COOKIE['mtwebLogin']) ) {


    $this->_checkRemembered($_COOKIE['mtwebLogin']);



    }



    }





    اينكلاس كه تعريف ميشه آبجكت ما رو ميسازه البته اين كاملا مدوله شده نيست اما يكتاريخ مشكل بزرگي نيست و شما مي تونين اونو با اسكريپتهايي كه بقيه دوستان نوشتن بهصورت شمسي توليد كنيد در اينجا ما چنين چيزي رو مي سازيم:
     

    $date = gmdate(\"'Y-m-d'\");


    $db = db_connect();


    $user = new User($db);




    حالا براي روشن شدن هدف كد يعني لاگينكردن تلاش مي كنيم ما ابتدا كنترل مي كنيم كه آيا كاربر لاگين كرده يا نه اگر اينكار رو كرده بود ما جلسات رو چك مي كنيم(فراموش نكنين كه اين يك كد امنيتي) وگرنهيك كوكي رو نام گذاري مي كنيم براي كنترل كردن اين به ما اجازه مي ده كه بينندگانسايت رو شناسايي كنيم

    3-1ـ لاگين كردن كاربران:

    براي اجازه دادن بهكاربران براي لاگين كردن شما بايد يك فرم وب بسازيد پس از اعتبار سنجي فرم شما ميتونيد اعتبار كاربر رو براي تائيد اطلاعات وارد شده كنترل كنيد كه براي اينكار از
    $user->_checkLogin('username', 'password', remember)
    استفاده ميكنيم
    خاطر نشان مي كنيم كه يوزر نيم و پسورد البته نبايد ثابت باشند و ريممبر يكمقدار بولين است كه به كاربر اجازه مي دهد تا با درست قرار دادن مقدار آن لاگينخودكار را فعال بسازد

    function _checkLogin($username, $password, $remember) {



    $username = $this->db->quote($username);


    $password = $this->db->quote(md5($password));



    $sql = \"SELECT * FROM member WHERE \" .


    \"username = $username AND \" .


    \"password = $password\";



    $result = $this->db->getRow($sql);



    if ( is_object($result) ) {


    $this->_setSession($result, $remember);


    return true;


    } else {


    $this->failed = true;


    $this->_logout();


    return false;


    }



    }





    تعريف تابع بايد در مكانيكنار كلاس تعريف شده يوزر باشه مانند تمام كدهاي پائين در تابع ازمتدPEAR::DB's quote استفاده كردم تا اطلاعات با امنيت كامل به بانكاطلاعاتي انتقال پيدا كنند و به صورت بي ختري نيز از آن رهاي يابند و باز گردنند مناز تابع ام دي فايو ترجيحا به جاي توابع ماي اسكيو ال استفاده كردم تا شما اگر مايلبوديد بتوانيد از بانكهاي اطلاعاتي ديگر نيز استفاده كنيد.
    حلقه ور بهينه شدهزيراكه يوزرنيم به صورت منفرد تعريف شده است نيازي به كنترل خطاهاي بانكاطلاعاتي نيست زيراكه خطاهاي پيشفرض قبلا در بالا ست شدند چنانچه آبجكت با رزالتبانك اطلاعاتي متچ شود لذا متغير جلسات ست مي شوند و مقدار ترو باز ميگرددوگرنه مقدار فلد با ترو برابر مي گردد شما مي تونين اينجا يك دستور كنترلي قراردهيد تا پيغام سقوط عمليات لاگين رو اعلام كنه و براي انجام لاگ اوت براي اينبيننده كافيست تاsession_defaults() را اجرا كنيم

    3-3ـ وضع كردنجلسه:
     

    function _setSession(&$values, $remember, $init = true) {



    $this->id = $values->id;


    $_SESSION['uid'] = $this->id;


    $_SESSION['username'] = htmlspecialchars($values->username);


    $_SESSION['cookie'] = $values->cookie;


    $_SESSION['logged'] = true;



    if ($remember) {



    $this->updateCookie($values->cookie, true);



    }



    if ($init) {



    $session = $this->db->quote(session_id());


    $ip = $this->db->quote($_SERVER['REMOTE_ADDR']);



    $sql = \"UPDATE member SET session = $session, ip = $ip WHERE \" .


    \"id = $this->id\";


    $this->db->query($sql);



    }

    }

    اينمتد متغير جلسه را ست مي كند و همچنين اگر در خواست كوكي براي داشتن لاگين مسمتر (خودكار) ارسال شده باشد
    همچنين اين متد يك پارامتر دارد كه معين مي كند كه اينبار اول لاگين كردن است يا نه (از طريق فرم يا كوكي)
    يا كنترل جلسه براي اولينبار نيست.

    4ـ لاگين خود كار:
    اگر بينندگان در خواست كنند كه كوكي ارسالبشه تا دفعات بعدي از لاگين كردن در هر مشاهده از سايت بپريد
    اين دو متد به شمابراي رسيدن به اين مهم كمك خواهد كرد

    function updateCookie($cookie, $save) {



    $_SESSION['cookie'] = $cookie;


    if ($save) {



    $cookie = serialize(array($_SESSION['username'], $cookie) );


    set_cookie('mtwebLogin', $cookie, time() + 31104000, '/directory/');


    }



    }






    4-1ـ كنترللاگين خود كار:
    اگر كاربران لاگين خودكار را انتاخاب كرده باشند كه به اسكريپتاجازه ذخيره كوكي را مي دهد كه كنترل مي شه از طريق متد زير


    function _checkRemembered($cookie) {



    list($username, $cookie) = @unserialize($cookie);


    if (!$username or !$cookie) return;



    $username = $this->db->quote($username);


    $cookie = $this->db->quote($cookie);



    $sql = \"SELECT * FROM member WHERE \" .


    \"(username = $username) AND (cookie = $cookie)\";



    $result = $this->db->getRow($sql);



    if (is_object($result) ) {


    $this->_setSession($result, true);


    }



    }







    اين تابع هرگز نبايد توسطپيغام خطايي متوقف شود براي ساختن چيزهاي امن تر با كوكي ها مقدار كوكي در كوكيذخير مي شود نه پسورد كاربر يكي از اين راه ها مي تونه درخواست يك لغت عبور باشهبراي ناحيه اي كه به امنيت بيشتري نياز دارد

    5-5ـ مطمئن شدن از اعتبارجلسه:

    function _checkSession() {



    $username = $this->db->quote($_SESSION['username']);


    $cookie = $this->db->quote($_SESSION['cookie']);


    $session = $this->db->quote(session_id());


    $ip = $this->db->quote($_SERVER['REMOTE_ADDR']);



    $sql = \"SELECT * FROM member WHERE \" .


    \"(username = $username) AND (cookie = $cookie) AND \" .


    \"(session = $session) AND (ip = $ip)\";



    $result = $this->db->getRow($sql);



    if (is_object($result) ) {


    $this->_setSession($result, false, false);


    } else {


    $this->_logout();


    }



    }





    پوفبالاخره آخرين قسمت كار ما كنترل مي كنيم كه آيا كوكي ذخيره شده در جلسه درست هستيا نه جلسه آي دي و آي پي كاربر
    با يك پارامتر كه اجازه مي ده كه بفهميم كه ايناولين بار لاگين كردن در سيستم هست بنابراين setSessionفراخواني
    مقدار آي پي وآي دي در جلسه بروز رساني نشود كه در بقيه موارد بطور معمول انجام مي شود


    آخرین ویرایش به وسیله دکمه64 : سه شنبه 26 آذر 1387 در 22:24 عصر

  2. #2
    کاربر دائمی آواتار zoghal
    تاریخ عضویت
    شهریور 1383
    محل زندگی
    همدان
    سن
    41
    پست
    401

    نقل قول: چگونه يك برنامه لاگين امن و حرفه اي طراحي كنيد ?

    لطفا کد ها رو در تگ code قرار بدید در نمای بهتری داشته باشه

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •