سفارش تبلیغ
صبا ویژن
 
آموشهای تخصصی کامپیوتر و طراحی سایت
درباره وبلاگ


لینک های ویژه
طول ناحیه در قالب بزرگتر از حد مجاز
آمار وبلاگ
  • بازدید امروز: 8
  • بازدید دیروز: 3
  • کل بازدیدها: 411254



پنج شنبه 92 فروردین 29 :: 10:36 صبح ::  نویسنده : smfatemi
article

هوشمند سازی پنل ورود و خروج سایت

در مطالب قبلی از بخش آموزش کاربردی کار با php و mysql، به طور مفصل به مبحث ساخت فرم عضویت و ورود و خروج کاربران پرداختیم، بحث نشست ها یا سشن (session) را با هم مرور کرده و با نحوه رمزنگاری کلمه عبور و همچنین ذخیره و بازیابی اطلاعات اعضاء سایت آشنا شدیم، این بار در تکمیل آموزش های قبلی، می خواهیم کمی بخش مدیریت سایتمان را توسعه داده و آن را به اصطلاح هوشمندتر کنیم، در این مطلب خواهیم دید که چگونه می توان امکاناتی مانند "مرا به خاطر بسپار" و  خروج خودکار بعد از چند دقیقه غیر فعال بودن را در پنل سایت خود افزود.
ایجاد امکان "مرا به خاطر داشته باش" در پنل سایت

حتما سایت های زیادی را دیده اید که در هنگام ورود اطلاعات نام کاربری و کلمه عبور، معمولا به صورت یک چک باکس، امکانی تحت عنوان "مرا به خاطر داشته باش" یا عباراتی از این دست دارند، این امکان در واقع به این معنی است که سیستم تا مدت زمان معینی از شما در مراجعات بعدی نام کاربری و کلمه عبور نخواهد خواست و به صورت هوشمندانه ای شما را به یاد خواهد داشت، اما این امکان چگونه ایجاد می شود؟
این امکان به این صورت کار می کند: هنگامی که گزینه مورد نظر را انتخاب می کنید، برنامه یک کوکی (ckookie) در مرورگر شما ایجاد کرده و متناسب با آن کوکی، در سرور، متغیرهای سشن را برای مدت زمانی که برنامه نویس تعیین کرده است (به فرض یک ماه) نگهداری می کند، تا زمانی که سشن های مورد نظر در سرور وجود دارند و به طور مثال به دلیل منقضی شدن تاریخ کوکی یا کلیک کاربر بر روی دکمه خروج، unset نشده و از بین نرفته اند، کاربر برای سرور قابل شناسایی است و بدون ورود نام کاربری و کلمه عبور، حتی با بستن پنجره مرورگر و مراجعه بعدی، می تواند از امکانات بخش اعضاء استفاده نماید، برای ایجاد این امکان در php ابتدا به فرمی که در آموزش قبل ساخته ایم یک چک باکس اضافه می کنیم (اگر آموزش قبلی را مطالعه نکرده اید، می توانید در انتهای این مطلب، از دکمه مربوط به مطالب قبلی و بعدی استفاده نمایید).

 

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | پنل ورود و خروج در سایت با php و mysql</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    direction:rtl;
    font-size:12px;
}
</style>
</head>
<body>
<form action="login.php" method="post">
<label for="user">نام کاربری:</label><br />
<input name="username" id="user" type="text" maxlength="255" /><br /><br />
<label for="pass">کلمه عبور:</label><br />
<input name="password" id="pass" type="password" maxlength="255" /><br /><br />
<label for="remember">مرا به خاطر بسپار:</label>
<input type="checkbox" name="remember" id="remember" checked="checked" value="1" /><br /><br />
<input type="hidden" name="check" value="sended" />
<input type="submit" value="ورود" />
</form>
</body>
</html>


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

توضیح:
- همان طور که ملاحظه می کنید؛ چک باکس ما در فرم بالا از نوع  input و checkbox است.
- برای اینکه به طور پیش فرض، چاک باکس فعال بوده و به حالت انتخاب شده درآمده باشد، بخش checked را اضافه می کنیم، اگر مایل هستید که به طور پیش فرض، (تیک) چک باکس غیر فعال باشد، این قسمت را حذف کنید.
- مقادیر value برای فرم بالا و قسمت چک باکس که عدد یک در نظر گرفته شده، فرضی است، شما می توانید مقادیر دیگری مثل true، ok و... در نظر بگیرید، اما نکته مهم این است که ما این مقادیر را در سمت سرور و در کد php خود به عنوان یک متغیر از فرم html دریافت خواهیم کرد تا از انتخاب شدن یا نشدن این گزینه توسط کاربر اطمینان حاصل کنیم.
اکنون در سمت سرور کد php با نام فرضی login.php را که در آموزش پیشین ساختیم، به صورت زیر ویرایش می کنیم.


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

<?php
//شروع یک نشست
session_start();
//دریافت و تنظیم متغیرهای ارسال شده توسط کاربر
@$username = $_POST["username"];
@$password = $_POST["password"];
@$check = $_POST["check"];
$check_error = 0;
//بررسی معتبر بودن اطلاعات ارسالی کاربر
//نام کاربری
if (!isset($username) || $username == ""){
    echo "فیلد نام کاربری نباید خالی باشد!";
    $check_error = 1;
}
//کلمه عبور
elseif (!isset($password) || $password == ""){
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $check_error = 1;
}
//اطلاعات اتصال به پایگاه داده
$con = mysql_connect("localhost", "user", "pass")
or die(mysql_error());  
//نام دیتابیس
mysql_select_db("db", $con)
or die(mysql_error());
//جلوگیری از نفوذ به دیتابیس
$username = mysql_real_escape_string($username);
$password = md5($password);
if ($check_error != 1 && $check == "sended"){
    //تطبیق اطلاعات کاربر با آنچه که در دیتابیس ذخیره شده
    $result = mysql_query ("SELECT * FROM register WHERE username = "$username" AND password = "$password"");
    // تعداد ردیف های موجود
    $count = mysql_num_rows($result);
    if($count > 0){
        // اطلاعات کاربر درست است، تنظیم مجوز های استفاده از بخش اعضاء
        $_SESSION["username"] = $_POST["username"];
        $_SESSION["password"] = $_POST["password"];
        $_SESSION["remember"] = $_POST["remember"];
        // اطلاعات کاربر صحیح است، انتقال به صفحه اعضاء
        header("location:user.php");
    }
    else{
        // اطلاعات کاربر صحیح نیست
        echo "Error!<br />";
    }
}
//پایان ارتباط با پایگاه داده 
mysql_close($con);
?>

 

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

توضیح:
- در این فایل ما سشن remember را به کد خود افزوده ایم که مقادیر آن در واقع همان مقادیر چک باکس خواهد بود.

$_SESSION["remember"] = $_POST["remember"];

به این صورت، اگر کاربر تیک "مرا به خاطر داشته باش" را غیر فعال نکرده باشد، مقدرا آن 1 و در غیر این صورت مقدار آن خالی خواهد بود.
- به دلیل اینکه در اینجا ما از تابع header و در ادامه از تابع setcookie استفاده می کنیم، باید هیچ نوع خروجی html و حتی فضای خالی یا کاراکترهای نامرئی (byte order mark یا BOM) پیش از فراخوانی آنها از طریق مرورگر ارسال نکنیم، در غیر این صورت با پیغام خطای headers already sent مواجه خواهیم شد، از این رو در کد خود، مقادیر کدهای html را حذف کرده ایم و در عوض با ایجاد یک انتقال از طریق header و location، کاربر را به طور خودکار به صفحه دیگر منتقل می کنیم.
حال نوبت به مقایسه مقادیر چک باکس و تنظیم یا عدم تنظیم کوکی است؛ لذا پس از انتقال کاربر به فایل user.php که در واقع محیط کاربری اعضای سایت است، مقادیر سشن remember را که پیش تر با دریافت اطلاعات فرم ورود تنظیم کرده ایم، بررسی می کنیم، اگر مقدار آن 1 بود، پس کاربر تمایل دارد که اطلاعاتش به خاطر سپرده شود، لذا کوکی را تنظیم می کنیم، اگر غیر از این بود، یعنی نباید کوکی یادآوری کاربر تنظیم شود.


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

<?php
//شروع یک نشست
session_start();
//بررسی تنظیم شدن یا نشدن متغیرهای سشن
if (!isset($_SESSION["username"]) || !isset($_SESSION["password"])){
//در صورتی که متغیرهای سشن تنظیم نشده باشند، کاربر مجاز به دیدن ادامه صفحه نیست و او را به صفحه اصلی منتقل می کنیم
header("location:index.php");
die();    
}
//بررسی امکان مرا به خاطر بسپار
elseif (isset($_SESSION["remember"]) && $_SESSION["remember"] == "1"){
    $login_time=3600;//یک ساعت
    setcookie(session_name(),session_id(),time()+$login_time,("/"));
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | محیط کاربری اعضای سایت</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    direction:rtl;
    font-size:12px;
}
</style>
</head>
<body>
شما در حال استفاده از بخش کاربری سایت هستید!
</body>
</html>


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

توضیح:
- از تابع setcookie برای تمدید مهلت استفاده از بخش اعضاء برای یک بار ورود کاربر (با ایجاد یک کوکی ) استفاده می کنیم.
- تابع setcookie باید یک آرگومان به صورت زمان به ثانیه داشته باشد که نمایانگر مدت زمان فعال بودن کوکی است، به فرض برای یک ساعت مقادیر 3600 ثانیه یا برای یک ماه معادل 2592000 ثانیه، بدین منظور ما از تابع time با افزودن یک مقدار به آن استفاده کرده ایم.
- نام کوکی با پارامتر session_name و مقادیر آن با session_id ذخیره می شود، همچنین برای تعیین یک مسیر (path) ذخیره سازی اطلاعات کوکی، پارامتر آخر را اضافه می کنیم، با تنظیم آن به صورت "/"، کوکی برای تمام فولدرهای یک سرور قابل دسترسی خواهد بود، در صورت عدم استفاده از متغیر path به طور پیش فرض، کوکی فقط در دایرکتوری که آن را ایجاد کرده است قابل استفاده است، به فرض با تنظیم آن به صورت "/user/" کوکی فقط در این فولدر قابل استفاده است، از این رو بهتر است همواره از روش ذکر شده در مثال استفاده کنید.
توجه کنید که قابلیت "مرا به خاطر داشته باش" برای برنامه هایی که به امنیت بالایی احتیاج دارند، معمولا توصیه نمی شود، چرا که اگر کاربر به هر دلیل از سیستم به شکل استاندارد خارج نشود (به فرض پنجره مرورگر خود را ببندد یا برق به طور ناگهانی  قطع شود)، فردی دیگر بر روی همان سیستم (و همان مرورگر) می تواند بدون وارد کردن نام کاربری و کلمه عبور و تنها با داشتن آدرس url صفحه کاربری، وارد قسمت مدیریت شود، متاسفانه این مشکلی است که بیشتر از روی ناآگاهی و معمولا در کامپیوترهای اشتراکی مانند کافی نت ها اتفاق می افتد؛ لذا استفاده از این امکان باید با در نظر گرفتن هشدارها و نکات امنیتی صورت گیرد.
ایجاد امکان خروج خودکار بعد از مدت زمان عدم فعالیت

در مقابل امکان "مرا به خاطر داشته باش"، قابلیت دیگری را نیز می توان برای پنل مدیریت سایت در نظر گرفت که معمولا به دلیل وجود حساسیت های خاص و ارتقاء امنیت صورت می گیرد، این امکان ایجاد یک سیستم خودکار خروج است، یعنی اگر به فرض مدت زمانی کاربر بدون فعالیت در صفحه باقی بماند، نشست او خود به خود منقضی شود، در این حالت حتی در موقعی که پنجره مرورگر هنوز باز است، اعتبار کاربر در سرور به پایان می رسد و او باید مجددا در پنل سایت وارد شود، این امکان معمولا در سیستم هایی که جنبه امنیت برایشان از اهمیت بالایی برخوردار است (مانند سیستم تراکنش های بانکی و مالی، کنترل پنل هاست ها و...) به کار گرفته می شود.
برای افزودن این امکان به سیستم خود، ابتدا در فایل اصلی لاگین، یعنی login.php مقادیر زیر را در ابتدای کد اضافه کنید.


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

<?php
//زمان برای خروج خودکار کاربر
$now_time = time();
$_SESSION["time_started"] = $now_time;     
$_SESSION["time_remaining"] = 3600;
?>


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

به این صورت:



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

<?php
//شروع یک نشست
session_start();
//زمان برای خروج خودکار کاربر
$now_time = time();
$_SESSION["time_started"] = $now_time;     
$_SESSION["time_remaining"] = 3600;
//دریافت و تنظیم متغیرهای ارسال شده توسط کاربر
@$username = $_POST["username"];
@$password = $_POST["password"];
@$check = $_POST["check"];
$check_error = 0;
//بررسی معتبر بودن اطلاعات ارسالی کاربر
//نام کاربری
if (!isset($username) || $username == ""){
    echo "فیلد نام کاربری نباید خالی باشد!";
    $check_error = 1;
}
//کلمه عبور
elseif (!isset($password) || $password == ""){
    echo "فیلد کلمه عبور نباید خالی باشد!";
    $check_error = 1;
}
//اطلاعات اتصال به پایگاه داده
$con = mysql_connect("localhost", "user", "pass")
or die(mysql_error());  
//نام دیتابیس
mysql_select_db("db", $con)
or die(mysql_error());
//جلوگیری از نفوذ به دیتابیس
$username = mysql_real_escape_string($username);
$password = md5($password);
if ($check_error != 1 && $check == "sended"){
    //تطبیق اطلاعات کاربر با آنچه که در دیتابیس ذخیره شده
    $result = mysql_query ("SELECT * FROM register WHERE username = "$username" AND password = "$password"");
    // تعداد ردیف های موجود
    $count = mysql_num_rows($result);
    if($count > 0){
        // اطلاعات کاربر درست است، تنظیم مجوز های استفاده از بخش اعضاء
        $_SESSION["username"] = $_POST["username"];
        $_SESSION["password"] = $_POST["password"];
        $_SESSION["remember"] = $_POST["remember"];
        // اطلاعات کاربر صحیح است، انتقال به صفحه اعضاء
        header("location:user.php");
    }
    else{
        // اطلاعات کاربر صحیح نیست
        echo "Error!<br />";
    }
}
//پایان ارتباط با پایگاه داده 
mysql_close($con);
?>


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

توضیح:
- در ابتدا ما زمان آخرین فعالیت کاربر را در متغیر now_time ذخیره می کنیم و آن را به سشن time_started نسبت می دهیم.
- سپس حداکثر زمان مجاز برای ماندن کاربر در صفحات (بدون رفرش کردن یا رفتن به صفحه دیگر) را  در سشن دیگر با نام time_remaining تنظیم می کنیم.
این اطلاعات به دلیل اینکه از نوع سشن هستند، در صفحات دیگر که در آنها نیز سشن را شروع می کنیم (با session_start)، قابل دسترسی می باشند، لذا پس از انتقال کاربر به صفحه user.php می توانیم حداکثر زمان مجاز را با زمان آخرین فعالیت او مقایسه کنیم، اگر اختلاف کم تر از صفر بود، پس کاربر زمانی ندارد و باید از نو وارد سیستم شود، در غیر این صورت حداکثر زمان او را برای به فرض 1 ساعت دیگر (3600 ثانیه) تمدید می کنیم، این کار را در ادامه انجام داده ایم.

<?php
//شروع یک نشست
session_start();
//بررسی تنظیم شدن یا نشدن متغیرهای سشن
if (!isset($_SESSION["username"]) || !isset($_SESSION["password"])){
//در صورتی که متغیرهای سشن تنظیم نشده باشند، کاربر مجاز به دیدن ادامه صفحه نیست و او را به صفحه اصلی منتقل می کنیم
header("location:index.php");
die();    
}
//بررسی امکان مرا به خاطر بسپار
elseif (isset($_SESSION["remember"]) && $_SESSION["remember"] == "1"){
    $login_time=3600;//یک ساعت
    setcookie(session_name(),session_id(),time()+$login_time,("/"));
}
//مقایسه زمان باقی مانده
$old_time = $_SESSION["time_started"];     
$new_time = time();    
$remain_time = $new_time - $old_time;     
$_SESSION["time_remaining"] = $_SESSION["time_remaining"] - $remain_time;     
if ($_SESSION["time_remaining"] > 0) {
    //تمدید مهلت
    $_SESSION["time_started"] = $new_time;    
}
else {
    //زمان کاربر به پایان رسیده است، انتقال به صفحه ورود
    header("location:index.php");     
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | محیط کاربری اعضای سایت</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    direction:rtl;
    font-size:12px;
}
</style>
</head>
<body>
شما در حال استفاده از بخش کاربری سایت هستید!
</body>
</html>

 

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

با کمی دقت در کد بالا و آشنایی با نحوه عملکرد سشن ها در php، به راحتی می توانید فعل و انفعالات صورت گرفته را در مثال بالا تفسیر کرده و با توجه به برنامه خود از آنها استفاده نمائید.




موضوع مطلب :