19
تشکر

سشن ها (Sessions) در PHP

PHP – پی اچ پی

PHP – پی اچ پی

$_SESSION یک آرایه مخصوص برای ذخیره درخواست های کاربر در حین بازدید از سایت یا اپلیکیشن شما است. به این معنی که شما با استفاده از سشن ها میتوانید اطلاعات مورد نیاز خودتان را برای هر کاربر ذخیره کنید و در حین بازدید کاربر از سایتتان از آنها استفاده کنید.

برخلاف کوکی ها که در کامپیوتر کاربر ذخیره میشوند سشن ها در سرور ایجاد میشوند و امنیت خیلی بیشتری نسبت به کوکی ها دارند.

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

در این مطلب با هم به نحوه ایجاد سشن ها و از بین بردن آنها و نکات امنیتی می پردازیم.

استفاده از Sessions

قبل از اینکه بتوانید اطلاعات مخصوص هر کاربر را داخل سشن مربوطه ذخیره کنید باید ابتدا سشن را آغاز کنید. اینکار باید ابتدای صفحه و قبل از هر گونه کد از قبیل HTML, JavaScript و یا PHP باشد. برای شروع یک سشن باید دستور زیر را در ابتدای فایل قرار داد:

<?php
  session_start();
  $_SESSION&#91;"username"&#93; = "Hamid";
&#91;/php&#93;</div>
<p dir="RTL">در کد بالا در خط دوم با استفاده از یک تابع, سشن را آغاز کردیم و در خط بعد داخل آرایه $_SESSION یک خانه به نام username ایجاد کرده و مقدار Hamid را داخل آن گذاشتیم.</p>
<p dir="RTL">اگر شما ابتدا سشن را آغاز نکنید نمیتوانید از آرایه $_SESSION برای ذخیره مقادیر خود استفاده کنید.</p>
<p dir="RTL">در فایل دوم دوباره سشن را آغاز میکنیم و مقدار username را که در فایل اول داخل سشن ذخیره کردیم را نمایش میدهیم. به صورت زیر:</p>
<div class="mycode">[php]
<?php
  session_start();
  echo "Username: " . $_SESSION&#91;"username"&#93;;
&#91;/php&#93;</div>
<p dir="RTL">این یک نمونه بسیار ساده از ذخیره اطلاعات در سشن بود. برای مثال اگر شما در زمان ورود یک کاربر به سایت نام کاربری آن را داخل سشن ذخیره کنید در تمام صفحات دیگر نیز میدانید کدام نام کاربری در حال استفاده از سایت است و درخواست ها را با توجه به آن بررسی میکنید.</p>

<h3 dir="RTL">پایان یک سشن</h3>
<p dir="RTL">خیلی مهم است که در زمانی که به اطلاعات داخل سشن احتیاجی ندارید آنها را از بین ببرید زیرا هم از لحاظ امنیتی مهم است و هم از انباشته شدن اطلاعات بیهوده بر روی سرور جلوگیری میکنید.</p>
<p dir="RTL">برای از بین بردن مقدار یک خانه از آرایه $_SESSION به صورت زیر عمل میکنیم:</p>
<div class="mycode">[php]
unset($_SESSION["username"]);

و برای از بین کل اطلاعات سشن میتوان از تابع زیر استفاده کرد:

session_unset();

هر دو مثال بالا فقط روی اطلاعات داخل سشن تاثیر میگذارند نه روی خود سشن. اگر بخواهید یک سشن به طور کامل از بین برود برای مثال زمانی که کاربر log out میکند میتوانید از تابع زیر استفاده کنید:

session_destroy();

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

نکات امنیتی

زمان سشن

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

<?php
  session_start();
  
  $inactive = 600;
  if(isset($_SESSION&#91;'timeout'&#93;)){
    $sessionTTL = time() - $_SESSION&#91;'timeout'&#93;;
    if($sessionTTL > $inactive){
      session_destroy();
      header("Location: /logou.php");
    }
  }
  $_SESSION["timeout"] = time();

در کد بالا در صورتی که در مدت 600 ثانیه (10 دقیقه) از طرف کاربر هیج درخواستی به سایت صورت نگیرد. در صورت ایجاد درخواست پس از این زمان به صفحه log out فرستاده میشود و از سایت خارج میشود.

ایجاد دوباره Session ID

در زمانهایی که اتفاق های مهمی از طرف کاربر می افتد مانند ورود به سایت و یا ویرایش اطلاعات شخصی بهتر است Session ID دوباره ایجاد شود تا خطر حمله به یک Session ID خاص کمتر شود. در کد زیر پس از ورود کاربر به سیستم Session ID دوباره ایجاد میشود:


ذخیره اطلاعات در دیتابیس

در اولین زمانی که میدانید داده ها دائمی خواهند بود آن ها را در دیتابیس ذخیره کنید و از سشن بردارید. سشن فقط برای ذخیره اطلاعات گذرا استفاده میشود.

در این مطلب به نحوه ایجاد و ازبین بردن سشن ها و چند نکته امنیتی اشاره کردیم. توسط لینک های زیر میتوانید اطلاعات بیشتری کسب کنید:

PHP Manual – Sessions

PHP Security Consortium – PHP Security Guide: Sessions

Wikibooks – PHP Programming: Sessions

  • سمیه می‌گه:

    با سلام
    یه مثال کاملا ساده از سیشن آ می خواستم نمی دونم کارایش چیه کدهاشو دارم ولی دیزاینشو نمی دونم

  • خوب بود ولی یه سوال دارم , ارایه ای که توسط سشن ایجاد میشه قسمتی که ایدی timeout هست به صورت سیستمی مقدار دهی میشه یا باید خودم همچین چیزی رو تعریف کنم و بهش مقدار بدم بعد ازش استفاده کنم؟
    سوال بعدی این که تابع session_regenerate_id استفاده کنم بهتره یا اینکه داده ها رو ذخیره کنم بعد با استفاده از تابع session_destroy سشن رو از بین ببرم و بعد با session_start دوباره ایجاد کنم؟

  • Ali Amini می‌گه:

    سلام
    ممنون مطلب خوبی بود.
    فقط یه سوال:
    حتما باید پسووردی که از کاربر میگیریم به صورت هش ثبت کنیم؟


  • نظرات این مطلب بسته است.