تصدیق هویت کاربر

July 7, 2005 at 04:13 pm

متدهای تصدیق هویت کاربر یا همان Authentication Schemes یکی از مباحث جذاب در برنامه نویسی php است که باید نکات ایمنی را دقیقا در آن لحاظ کرد. روش های گوناگونی بدین منظور موجود است که با توجه به سطح امنیت مورد نیاز می توانید از آن ها استفاده کنید. مرسوم ترین روش برای این کار استفاده از یک بانک اطلاعاتی برای نگهداری اطلاعات کاربران است. مسلما در تصدیق هویت مبنی بر پایگاه داده ما قابلیت انعطاف و کارایی بیشری در مقایسه با کار با فایل ها به عنوان نگهدارنده اطلاعات خواهیم داشت. برای مثال کار با توابعی همچون md5 و crypt را به عنوان پنهان سازی اطلاعات در نظر بگیرید!

در این پست قصد داریم اسکریپتی بنویسم که با توجه به اطلاعات موجود در پایگاه داده Mysql هویت کاربر را تشخیص دهد. بعلت آنکه از سطح مقدماتی مقاله خارج نشویم اطلاعات را به صورت متنی در فیلد های جدول ذخیره می کنیم، اما برای رعایت نکات امنیتی حتما باید کلمه عبور را رمزنگاری کرد. query مورد نیاز برای ساخت جدول به شکل زیر است:

create table users (
   id INT NOT NULL,
   username VARCHAR(16),
   password VARCHAR(8),
   primary key(id));
 INSERT INTO `users` VALUES (0, 'alvan', 'alvan');

همان گونه که مشاهده می کنید این query یک جدول بنام users ایجاد می کند که دارای سه فیلد id،username و password است. برای هر فیلد مقداری را وارد می کنیم. دقت کنید که شناسه کاربری و اسم رمز در این مقادیر برابر alvan است.در مرحله بعدی برای اتصال به پایگاه داده یک تابع جدید بنام connect مطابق زیر ایجاد می کنیم:

<?  
  function connect() {
    if(!$db = @mysql_pconnect("localhost","mysqluser","password")){
      print("<h1>Cannot Connect to the DB!\n");
      return 0;
    } else {
      mysql_select_db("php", $db);
      return 1;
    }  
}

بجای localhost سرور پایگاه داده، mysqluser نام کاربری و password کلمه عبور دسترسی به پایگاه داده را قرار دهید. ضمنا آرگومان اولی تابع mysql_select_db نشانگر نام پایگاه در دتابیس سرور است که بصورت پیشفرض php انتخاب شده است. دقت کنید آن را مطابق با نام پایگاه داده خودتان تنظیم کنید. در کل، کار تابع mysql_select_db انتخاب پایگاه داده در دتابیس است و دو آرگومان دریافت می کند همان گونه که ذکر شد، اولی نام پایگاه داده و دومی پارامتر برقراری پیوند است. در مرحله بعدی برای چک کردن اطلاعات کاربر با اطلاعات موجود در پایگاه داده، تابع caller check_user رو به شکل زیر ایجاد می کنیم:

  function check_user($user, $password) {
    if(connect()) {
      $password = substr($password, 0, 8);
      $sql = "select * from users where username = '$user' and password = '$password'";
      $result = mysql_query($sql);
      if (mysql_num_rows($result) == 1) {
        setcookie("user",$user);
        setcookie("password",$password);
        return 1;
      } else {
        ?>
        <h3>Sorry, you are not authorized!</h3>
        <?
        return 0;
      }
    }
}  &#91;/php&#93;


همان طور که مشاهده می شود در این تابع دو آرگومان کلمه کاربری و رمز عبور دریافت می شود. در ابتدای کار ما در این تابع، تابع connect مرحله قبل را فراخوانی می کنیم. یک عبارت شرطی ایجاد می کنیم، اگر اتصال برقرار شد کلمه عبور و نام کاربری را که به عنوان ورودی به تابع ارسال شد با مقادیر ذخیر شده در بانک اطلاعاتی مقایسه می کنیم. اگر یکسان بود  هویت کاربر تصدیق می شود  در غیر اینصورت پیامی را مبنی بر عدم اختیار نمایش می دهیم. فکر نکنم نیاز به تحلیل یک یک توابع باشد.

فقط در همین حد بدانید که تابع setcookie تابعی است که کوکی توسط آن به سیستم کاربر ارسال می شود.  در اکثر موارد از دو آرگومان اول تابع استفاده می شود که اولی نام و دومی مقدار است. اما این تابع چهار آرگومان دیگر نیز دارد که توضیح آن در این حوصله نمی گنجد. ما در این مثال بعد از تصدیق هویت دو نام user و password را به همراه مقادیرشان به مرورگر کاربر ارسال کردیم. تقریبا عمده کار تمام شده است تنها یک عبارت شرطی به شکل زیر ایجاد می کنیم:

&#91;php&#93;  if(!isset($user) or !check_user($user, $password)) {
    ?>
    <h1>You must log in to view this page</h1>
    <form action = "authenticate.php" method="post">
    <p>Username: <input type="text" name="user"/><br />
    Password: <input type="password" name="password" maxlength="8" size="8"/><br />
    <input type="submit" name="submit" value="Submit"/>
    </p></form>
    <?
  } else {
    ?>
    <h1>Authorized!</h1>
    <?
  }
  ?>

همان طور که مشاهده می شود در عبارت شرطی فوق از عملگر or استفاده کردیم. یعنی حداقل باید یکی از دو بخش دارای ارزش TRUE باشد، تا نتیجه TRUEشود. حال دو بخش ما چیست؟ یکی اینکه توسط تابع isset تعیین می کنیم که آیا برای متغیر user مقداری در نظر گرفته شده است یا خیر؟ اگر مقدار داده شده درست بود شرط کافی است و دومی اینکه توسط تابع check_user که ایجاد کرده ایم، کلمه کاربری و رمز عبور را با اطلاعات ذخیر شده در دتابیس مقایسه می کنیم.

حال اگر حداقل یکی از دو شرط فوق برقرار بود پیام Authorized را نمایش می دهیم در غیر اینصورت یک فرم را برای ورود اطلاعات به همراه پیغام مناسب نمایش می دهیم. تنها دقت کنید چون اکشن فرم برابر با authenticate.php قرار گرفته است، نام صفحه مان را هنگام ذخیره کردن مشابه آن در نظر بگیریم. برای تمرین بیشتر می توانید این اسکریپت را از اینجا دریافت کنید. اگر تابعی برایتان نا آشنا بود یا عملکردش را ندانستید در نظرات عنوان کنید تا توضیحات بیشتر داده شود. موفق و موید باشید، مرتضی الوانی.

دسته: پی اچ پی | نویسنده: مرتضی الوانی
  1. 16 نظر برای این مطلب ارسال شده است. نظر خود را ارسال کنيد »

  1. 1

    گناهکار


    یه نفر یادش رفته قرار بود دیگه تخصصی ننویسه!!!
    الوان: والا هر کار می کنم جو اینجا نمی ذاره حرفای غیر تخصصی بزنم

    July 7, 2005 at 6:00 pm

  2. 2

    میلاد قیصری


    خیلی جالب بود آقای الوانی!
    فقط ادامه بده
    آقای گناهکار شما میتونید اینجا سر نزنید
    (شرمنده ها به آدرس سایت هم توجه کن!)

    July 7, 2005 at 9:39 pm

  3. 3

    گناهکار


    آقا میلاد والا من از روی پست قبلیه مرتضا این حرف رو زدم، شما هم احتمالن در مورد من اشتباه فکر کردین!

    July 8, 2005 at 2:33 am

  4. 4

    ميلاد قيصري


    آقاي گناهكار من قصد توهين نداشتم فقط گفتم به آدرس وب توجه كنيد!(شرمنده!)
    آقاي الواني ببخشيد كه اينجارو با يه فروم اشتباه گرفتيم!

    July 9, 2005 at 1:22 pm

  5. 5

    mohammad


    سلام
    مقاله ات عالی بود !
    موفق باشی

    July 9, 2005 at 1:37 pm

  6. 6

    علی


    سلام. ساده و مفید بود . از این مقاله ها سعی کن بیشتر بنویسی ;)

    July 9, 2005 at 2:48 pm

  7. 7

    قمارباز


    سلام ، امکان به تبادل لینک هست ؟

    July 11, 2005 at 1:30 am

  8. 8

    زوگولو


    ببخشید که بی‌ربط نظر می‌دم. ما دوباره برگشتیم! اگه می‌شه آدرس رو عوض کنین.

    July 11, 2005 at 2:09 pm

  9. 9

    مهدی


    سلام آقا ی الوانی از راه نمائی دفعه قبلتون ممنونم. ایندفعه ميتونيد طريقه ساختن درايو مجازي رو بوسيله نرم افزار (daemon tools)به من اموزش بديد يا بذاريد توي وبلاگتون؟ فقط راه بدون نرم افزارش رو نگید که بلدم..سلام آقا ی الوانی از راه نمائی دفعه قبلتون ممنونم. ایندفعه ميتونيد طريقه ساختن درايو مجازي رو بوسيله نرم افزار (daemon tools)به من اموزش بديد يا بذاريد توي وبلاگتون؟ فقط راه بدون نرم افزارش رو نگید که بلدم..

    August 5, 2005 at 6:20 am

  10. 10

    مهدی


    سلام
    خسته نباشید
    لطفا در صورت امکان من را در مورد چگونگی رای گیری الکترونیکی راهنمائی فرمائید.

    October 13, 2005 at 2:46 pm

  11. 11

    بهروز


    سعی کن چیزهایی که به درد بچهها میخورد بنویسی ممنونم
    دمت گرو

    November 19, 2005 at 11:52 am

  12. 12

    Sina


    salam va khaste nabashid!
    Agha Age momkene Mano Rahnamaee Konid
    Man Mikham Linkamo besoorate If Else Dar Php Benevisam Ya Hamoon Zamine Kardan Masallan http://www.l.com/Rege.php?id=1
    In Mesal Bood Age Mishe Mano Rahnamaee Konid
    Khili Mamnoon Misham

    December 13, 2005 at 12:00 am

  13. 13

    masoud


    age momkene dar morede data set benevis
    yadet bashe man taze kar nistam
    masalan age 10 ta jadval dashte bashim va bekhaim az harjadval ke be ham relation daran chand field ro estefade konim chekar konim ? han ?

    March 6, 2007 at 9:45 am

  14. 14

    مرتضی


    دوست عزیز سلام
    با سلام و تشکر سوالی در باره خروج امن کاربر داشتم. یعنی بعد از اینکه از این اسکریپت استفاده کردیم و کاربر با موفقیت لاگین شد برای خروجش باید چکار کنیم که مجددا با استفاده از دکمه بک اکسپلورر و یا هیستوری نشه برگشت؟

    با تشکر مجدد

    August 22, 2008 at 8:07 am

  15. 15

    سحر


    سلام من در حال انجام تحقیقی درمورد تشخیص هویت کاربران در php هستم میشه منو راهنمایی کنید یا مطالبی دراین مورد در وب سایتتون بگذارید.ممنون

    June 21, 2011 at 9:15 pm

  16. 16

    ali


    تشکر از اموزش خوبتان

    April 22, 2016 at 11:43 pm