در مقاله آموزشی تعیین تاریخ انقضا برای SESSION در php ، قصد داریم به شما نحوه تاریخ انقضا دادن به سیشن (Session) و به پایان رساندن SESSION بعد از زمان معلوم را نشان بدیم . این روش بیشتر در سایت های درگاه پرداخت بانک ها ، سیستم های پرداخت آنلاین و دیگر پنل های کاربری استفاده می شود . اهمیت تعیین تاریخ انقضا برای SESSION در php به جهات مختلفی نمایان می شود .
فرض کنید در صفحه عملیات حساب بانکی یا پنل مدیریت سایت هستید و به به مدت چندین دقیقه سیستم را به ترک می کنید . در همین حین ممکن است فردی دیگر دسترسی فیزیکی به کامپیوتر و لپ تاب شما داشته باشد و اطلاعات حساب شما لو برود . برای همین بهتر است در سیستم های مهمی که مربوط به پرداخت آنلاین یا حساب های کاربری مهم از قابلیت اتمام نشست (Session Timeout) استفاده کنید تا امنیت حریم خصوصی کاربران شما حفظ شود.
هنگامی که مدت زمان سپری شده تمام شد ، دیگر کاربر دسترسی به صفحه ای که قبلا احراز هویت و لاگین کرده را ، نخواهد داشت مگر اینکه دوباره اطلاعات لاگین را وارد کند (و یا اگر قبلا دکمه مرا به خاطر بسپار زده باشد ، فیلدها به صورت خودکار پرخواهند شد )
افزودن مرا به خاطر بسپار به فرم لاگین در php
اگر قبلا با سیشن ها کار نکردید ، حتما مقاله کار با سیشن ها (آموزش SESSION در php) را بخوانید.
در این آموزش ، ما زمان لاگین کاربر را به صورت timestamp در یک سیشن (SESSION) ذخیره می کنیم . با این مقدار timestamp ما بررسی می کنیم ، اگر مدت زمان سیشن کاربر تمام شد ، کاربر به صورت خودکار ، logout می شود .
ساخت سیستم تعیین تاریخ انقضا برای SESSION در php
کد HTML ساخت سیستم لاگین کاربر
این کد برای نمایش فرم لاگین به کاربر استفاده شده است .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<form name="frmUser" method="post" action=""> <?php if($message!="") { ?> <div class="message"><?php echo $message; ?></div> <?php } ?> <table border="0" cellpadding="10" cellspacing="1" width="100%" class="tblLogin"> <tr class="tableheader"> <td align="center" colspan="2">Enter Login Details</td> </tr> <tr class="tablerow"> <td align="right">Username</td> <td><input type="text" name="user_name"></td> </tr> <tr class="tablerow"> <td align="right">Password</td> <td><input type="password" name="password"></td> </tr> <tr class="tableheader"> <td align="center" colspan="2"><input type="submit" name="submit" value="Submit"></td> </tr> </table> </form> |
برای خواندن آموزش ساخت صفحه لاگین و ثبت نام با php کلیک کنید
ساخت سیشن لاگین کاربر
در این کد ، ما ID یوزر و زمان لاگین را در یک متغییر سراسری سیشن ذخیره می کنیم . بعد ، یک تابع php برای بررسی زمان انقضای session فراخوانی میکنیم . اگر مدت زمان سیشن به پایان نرسیده بود به صفحه پنل مدیریت هدایت میکنیم در غیر اینصورت کاربر را به صفحه logout.php و در نهایت لاگین مجدد هدایت (ریدایرکت | redirect )می کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
if(count($_POST)>0) { if( $_POST["user_name"] == "admin" and $_POST["password"] == "admin") { $_SESSION["user_id"] = 1001; $_SESSION["user_name"] = $_POST["user_name"]; $_SESSION['loggedin_time'] = time(); } else { $message = "Invalid Username or Password!"; } } if(isset($_SESSION["user_id"])) { if(!isLoginSessionExpired()) { header("Location:user_dashboard.php"); } else { header("Location:logout.php?session_expired=1"); } } |
برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود
آموزش ریدایرکت (Redirect) با php
ساخت تابع سفارشی PHP برای بررسی زمان انقضای SESSION
این تابع در اول تمام صفحاتی که نیاز به احراز هویت می باشد ، فراخوانی خواهد شد . این تابع php مقدار TRUE را برمی گرداند ، اگر تاریخ انقضا برای SESSION کاربر به اتمام برسد ، در غیر اینصورت مقدار FALSE را بازگشت می دهد .
1 2 3 4 5 6 7 8 9 10 |
function isLoginSessionExpired() { $login_session_duration = 10; $current_time = time(); if(isset($_SESSION['loggedin_time']) and isset($_SESSION["user_id"])){ if(((time() - $_SESSION['loggedin_time']) > $login_session_duration)){ return true; } } return false; } |
خروج (logout) کاربر بعد از اتمام تاریخ انقضای SESSION
صفحه logout.php سیشن کاربر لاگین شده را را منقضی (با اجرای تابع unset) میکند و همچنین وضعیت فلگ session_expired را چک میکند که اگر ست شده باشد ، پیام به اتمام رسیدن تاریخ انتقضا را به کاربر نمایش می دهد .
1 2 3 4 5 6 7 8 |
session_start(); unset($_SESSION["user_id"]); unset($_SESSION["user_name"]); $url = "index.php"; if(isset($_GET["session_expired"])) { $url .= "?session_expired=" . $_GET["session_expired"]; } header("Location:$url"); |
دید به چه راحتی تاریخ انقضا برای SESSION در php را ست کردیم . هر گونه مشکلی در پیاده سازی کدها داشتید ، از قسمت نظرات اقدام کنید . سریعا ، پاسخگوی سوالات شما هستیم .
برای دانلود سورس کد تعیین تاریخ انقضا برای SESSION در php از قسمت زیر اقدام کنید
موفق و پیروز باشید.
سلام لطفا سوال من رو جواب بدید
من در حال خرید یک محصول از درگاه بانک پارسیان بودم که بعد ار وارد کردن شماره حساب وبعد تایید نوشت سشن منقضی شده است
ایا خرید انجام شده
یا دوباره انجام بدم
سلام. خیر باید از اول خرید کنید
خیلی ممنون
سلام و خسته نباشید
با توجه به مقاله امنیت نشست ها که در سایت قرار دادید ، امکان سو استفاده از تاریخ توسط مهاجم هست؟ یعنی قبل چک کردن تاریخ انقضا
باید صحت تاریخ در نشست رو چک کنیم؟ با استفاده از یک هش؟
البته تمامی مراحل گفته شده در مقاله رعایت شده ، باز این کار لازم هست؟
سلام ممنونم .
خیر نیاز نیست که این مورد رو قرار بدید . بیشتر برای دسترسی های حساس پنل کاربری که امکان سو استفاده با دسترسی فیزیکی هستش , از تاریخ انقضا می تونید بهره ببرید. در غیر اینصورت راهکار های ارایه شده در مقاله آموزش امنیت session در php کفایت می کند.
موفق باشید
عالی بود ممنون.
خواهش می کنم . موفق باشید.
سلام
یه سوال برام پیش اومده.
چرا به جای unset از session_destroy(); استفاده نکردید؟
و مزایاش چیه.
اگه در مورد امنیت در سشن هم یک مطلب بزارید ممنون میشم.
یک سوال دیگه.
توی هدر دستور session_start(); نوشتم ، توی لوکال مشکلی نیست ولی توی هاست ارور زیرو میده.
اینم راهنمایی کنید ممنونم.
session_start(): Cannot send session cache limiter – headers already sent
بازم ممنون.
سلام . با تابع unset می تونیم بک سیشن خاص رو حذف کنیم مثلا اگر دو سیشن login و expire ست شده باشند با تابع unset یکی از آنها را می تونیم حذف کنیم ولی تابع session_destroy() تمام سیشن های ست شده را حذف میکند .
در صفحاتی که به هر طریقی از متغییر $_SESSION استفاده می کنید ، حتما و حتما انجین session_start() را در اولین خط استارت کنید و قبلش هیچ کد html حتی echo یک کاراکتر هم وجود نداشته باشد . در لوکال هاست به علت فعال بودن output buffering این مشکل وجود نداره ولی در سرور واقعی این قابلیت به طور پیش فرض از تنظیمات php.ini فعال نیست و برای مواجه نشدن با این ارور معروف headers already sent در خطوط اول هر فایلی که از سیشن استفاده میشه تابع ob_start() رو فراخوانی کنید .
دلیل ارور headers already sent هم این است که درخواستی که به سمت سرور ارسال می شود اگر از قبل قابلیت استفاده از سیشن در http header اضافه نشود در درخواست های بعدی که از سمت شما ارسال می شود در کار با توابع و متغییر های سراسری که با سیشن در ارتباط هستند به مشکل بر میخورند .
برای آشنایی با انواع خطاها در php و نحوه رفع آن و ریدارکت با php کلیک کنید
در مورد امنیت سیشن هم حتما مطلبی رو آماده می کنم .
موفق باشید.
سلام . مقاله افزایش امنیت SESSION در php در سایت قرار گرفت . موفق باشید .