سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
Session در PHP چیست؟ آموزش Session و مدیریت ورود کاربران در PHP

Session در PHP چیست؟ آموزش Session و مدیریت ورود کاربران در PHP

ممدیر کل سیستم ۲۶ شهریور ۱۴۰۵ ۲۱ دقیقه مطالعه ۱ بازدید
Session در PHP چیست؟ آموزش Session و مدیریت ورود کاربران در PHP

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

در PHP برای نگهداری اطلاعات مربوط به وضعیت کاربر بین درخواست‌های مختلف، یکی از مهم‌ترین ابزارها Session است.

Session در PHP به ما اجازه می‌دهد اطلاعاتی مانند شناسه کاربر، وضعیت ورود، نقش کاربر و سایر داده‌های موقت مربوط به یک نشست را در سمت سرور نگهداری کنیم.

در این مقاله یاد می‌گیریم:

  • Session در PHP چیست؟
  • Session چگونه کار می‌کند؟
  • session_start() چه کاری انجام می‌دهد؟
  • چگونه اطلاعات را داخل Session ذخیره و دریافت کنیم؟
  • چگونه Session را حذف کنیم؟
  • چگونه سیستم ورود کاربران را با Session پیاده‌سازی کنیم؟
  • Session ID چیست؟
  • چگونه Session را امن کنیم؟
  • تفاوت Session و Cookie چیست؟
  • تفاوت Session و JWT چیست؟
  • Session Fixation و Session Hijacking چیست؟
  • چگونه برای Session زمان انقضا تعیین کنیم؟

Session در PHP چیست؟

Session مکانیزمی برای نگهداری اطلاعات مربوط به یک کاربر در چند درخواست مختلف HTTP است.

HTTP ذاتاً یک پروتکل Stateless است؛ یعنی هر درخواست HTTP به صورت مستقل از درخواست قبلی پردازش می‌شود.

برای مثال، فرض کنید کاربر ابتدا این درخواست را ارسال کند:


/login

و سپس وارد صفحه زیر شود:


/profile

سرور به صورت ذاتی نمی‌تواند صرفاً از روی این دو درخواست متوجه شود که هر دو درخواست متعلق به یک کاربر هستند.

Session برای حل همین مسئله استفاده می‌شود.

در PHP معمولاً اطلاعات Session در سمت سرور ذخیره می‌شود و مرورگر یک Session ID را در اختیار دارد تا سرور بتواند Session مربوط به همان کاربر را پیدا کند.


# Session چگونه در PHP کار می‌کند؟

فرآیند کلی Session را می‌توان به شکل زیر در نظر گرفت:


کاربر

   ↓

درخواست به PHP

   ↓

session_start()

   ↓

بررسی Session ID

   ↓

پیدا کردن اطلاعات Session

   ↓

پردازش درخواست

   ↓

ارسال پاسخ

برای مثال، زمانی که کاربر وارد حساب خود می‌شود، می‌توانیم شناسه کاربر را داخل Session قرار دهیم:


$_SESSION['user_id'] = 25;

در درخواست‌های بعدی، PHP می‌تواند Session مربوط به همان کاربر را پیدا کند و مقدار زیر را در اختیار برنامه قرار دهد:


$_SESSION['user_id'];

به این ترتیب برنامه می‌فهمد که کاربر مورد نظر قبلاً وارد حساب خود شده است.


# session_start در PHP چیست؟

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


session_start();

مثلاً:


<?php



session_start();



echo "Session started";

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

بنابراین بهتر است session_start() قبل از HTML یا echo قرار بگیرد:


<?php



session_start();



echo "Hello";

و از چنین حالتی جلوگیری کنیم:


<?php



echo "Hello";



session_start();

چون ممکن است باعث خطای مربوط به ارسال Header شود.


# ذخیره اطلاعات در Session

بعد از اجرای session_start() می‌توانیم اطلاعات مورد نظر را در آرایه $_SESSION ذخیره کنیم.

مثلاً:


<?php



session_start();



$_SESSION['username'] = 'saeed';

$_SESSION['user_id'] = 25;

در این مثال دو مقدار داخل Session ذخیره شده است.

برای خواندن آن‌ها:


echo $_SESSION['username'];

خروجی:


saeed

یا:


echo $_SESSION['user_id'];

خروجی:


25


# آرایه $_SESSION در PHP چیست؟

$_SESSION یک Superglobal Array در PHP است که برای دسترسی به اطلاعات Session استفاده می‌شود.

مثلاً:


$_SESSION['name'] = 'Ali';

$_SESSION['email'] = 'ali@example.com';

$_SESSION['role'] = 'admin';

سپس می‌توانیم اطلاعات را دریافت کنیم:


echo $_SESSION['name'];

echo $_SESSION['email'];

echo $_SESSION['role'];

البته برای اطلاعات حساس بهتر است فقط داده‌هایی را در Session نگهداری کنیم که واقعاً برای مدیریت وضعیت کاربر لازم هستند.


# بررسی وجود یک مقدار در Session

ممکن است بخواهیم بررسی کنیم آیا یک مقدار در Session وجود دارد یا خیر.

مثلاً:


session_start();



if (isset($_SESSION['user_id'])) {

    echo "کاربر وارد شده است.";

} else {

    echo "کاربر وارد نشده است.";

}

این روش برای تشخیص وضعیت ورود کاربران بسیار کاربردی است.


# استفاده از null برای بررسی Session

در بعضی شرایط می‌توانیم از عملگر Null Coalescing نیز استفاده کنیم:


$userId = $_SESSION['user_id'] ?? null;

اگر user_id وجود داشته باشد، مقدار آن داخل $userId قرار می‌گیرد.

اگر وجود نداشته باشد:


$userId = null;

این روش در PHP مدرن بسیار کاربردی است.


# تغییر مقدار Session

مقدار ذخیره‌شده در Session را می‌توانیم به راحتی تغییر دهیم:


session_start();



$_SESSION['role'] = 'user';



$_SESSION['role'] = 'admin';

در این حالت مقدار جدید جایگزین مقدار قبلی می‌شود.


# حذف یک مقدار از Session

اگر بخواهیم فقط یک مقدار خاص را حذف کنیم، از unset() استفاده می‌کنیم:


session_start();



unset($_SESSION['user_id']);

در این حالت فقط user_id حذف می‌شود.

برای مثال:


$_SESSION['user_id'] = 25;

$_SESSION['username'] = 'saeed';



unset($_SESSION['user_id']);

اکنون:


user_id → حذف شده

username → باقی مانده


# حذف تمام اطلاعات Session

اگر بخواهیم تمام متغیرهای Session را حذف کنیم:


session_start();



session_unset();

اما اگر هدف ما خروج کامل کاربر باشد، بهتر است Session را به شکل کامل نابود کنیم.


# خروج کاربر از حساب با Session

یکی از کاربردهای اصلی Session، پیاده‌سازی Logout است.

یک روش رایج:


<?php



session_start();



$_SESSION = [];



session_destroy();

در این حالت اطلاعات Session فعلی پاک شده و Session از بین می‌رود.

برای یک Logout کامل‌تر می‌توانیم Cookie مربوط به Session ID را نیز در صورت استفاده از آن حذف کنیم.

مثلاً:


<?php



session_start();



$_SESSION = [];



if (ini_get('session.use_cookies')) {

    $params = session_get_cookie_params();



    setcookie(

        session_name(),

        '',

        time() - 42000,

        $params['path'],

        $params['domain'],

        $params['secure'],

        $params['httponly']

    );

}



session_destroy();

در پروژه‌های ساده، معمولاً این الگو را می‌توان در یک فایل یا تابع مخصوص Logout قرار داد.


# یک سیستم Login ساده با Session در PHP

حالا یک مثال واقعی‌تر را بررسی کنیم.

فرض کنید جدول کاربران ما چیزی شبیه این باشد:


users



id

name

email

password

کاربر ایمیل و رمز عبور خود را ارسال می‌کند.

پس از بررسی اطلاعات:


<?php



session_start();



$email = $_POST['email'] ?? '';

$password = $_POST['password'] ?? '';



if ($email === 'admin@example.com' && $password === '123456') {



    $_SESSION['user_id'] = 1;

    $_SESSION['user_name'] = 'Admin';



    echo "ورود موفق بود.";



} else {



    echo "ایمیل یا رمز عبور اشتباه است.";

}

در یک پروژه واقعی نباید رمز عبور را به صورت Plain Text مقایسه کنیم.

باید از روش‌هایی مانند:


password_hash()

و:


password_verify()

استفاده کنیم.


# Session بعد از ورود کاربر

فرض کنید Login موفق شده و این مقدار را ذخیره کرده‌ایم:


$_SESSION['user_id'] = 25;

حالا کاربر وارد صفحه پروفایل می‌شود.

در ابتدای فایل:


<?php



session_start();



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

    header('Location: login.php');

    exit;

}

اگر user_id وجود نداشته باشد، کاربر به صفحه Login منتقل می‌شود.

اما اگر وجود داشته باشد:


echo "به حساب کاربری خوش آمدید.";


# ساخت یک Middleware ساده با Session

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

مثلاً فایلی به نام:


auth.php

ایجاد می‌کنیم:


<?php



session_start();



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

    header('Location: login.php');

    exit;

}

سپس در صفحات خصوصی:


<?php



require_once 'auth.php';



echo "صفحه خصوصی کاربر";

به این ترتیب هر صفحه‌ای که auth.php را فراخوانی کند، ابتدا وضعیت ورود کاربر را بررسی می‌کند.

در فریم‌ورک‌هایی مانند Laravel نیز همین مفهوم به شکل حرفه‌ای‌تر با Middleware پیاده‌سازی می‌شود.


# Session ID چیست؟

هر Session معمولاً یک شناسه منحصربه‌فرد دارد که به آن:

Session ID

گفته می‌شود.

می‌توانیم Session ID فعلی را با تابع زیر مشاهده کنیم:


session_id();

مثلاً:


<?php



session_start();



echo session_id();

ممکن است خروجی چیزی شبیه این باشد:


9f8a7d6c5b4e3a2...

Session ID نقش مهمی در شناسایی Session کاربر دارد.

به همین دلیل اگر Session ID در اختیار فرد دیگری قرار بگیرد، می‌تواند خطر امنیتی ایجاد کند.


# Session ID چگونه به مرورگر منتقل می‌شود؟

در تنظیمات معمول PHP، Session ID می‌تواند در یک Cookie به مرورگر ارسال شود.

نام Cookie معمولاً چیزی مانند:


PHPSESSID

است.

مرورگر این Cookie را در درخواست‌های بعدی ارسال می‌کند و PHP بر اساس آن Session مربوطه را پیدا می‌کند.

بنابراین یک نکته مهم را باید در نظر داشته باشیم:

اطلاعات اصلی Session معمولاً در سمت سرور نگهداری می‌شوند، اما Session ID برای شناسایی آن Session در اختیار مرورگر قرار می‌گیرد.


# Session Fixation چیست؟

یکی از حملات مرتبط با Session، حمله‌ای به نام Session Fixation است.

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

یکی از اقدامات مهم برای جلوگیری از این مشکل، تغییر Session ID بعد از ورود موفق کاربر است.

برای این کار:


session_regenerate_id(true);

استفاده می‌کنیم.

مثلاً:


<?php



session_start();



// بررسی موفق اطلاعات Login



session_regenerate_id(true);



$_SESSION['user_id'] = 25;

بهتر است بعد از احراز هویت موفق، Session ID را بازتولید کنیم.


# چرا session_regenerate_id مهم است؟

فرض کنید کاربر قبل از ورود یک Session ID داشته باشد:


ABC123

بعد از ورود موفق، بهتر است Session ID تغییر کند:


XYZ789

یعنی Session مربوط به وضعیت جدید کاربر با یک شناسه جدید ادامه پیدا کند.

به همین دلیل در سیستم‌های Login بهتر است از:


session_regenerate_id(true);

استفاده شود.


# Session Hijacking چیست؟

Session Hijacking به وضعیتی گفته می‌شود که مهاجم Session ID معتبر یک کاربر را به دست می‌آورد و از آن برای دسترسی به Session کاربر استفاده می‌کند.

برای مثال اگر مهاجم Session ID کاربر را به دست آورد:


PHPSESSID=abc123...

ممکن است بتواند خود را به جای آن کاربر معرفی کند.

برای کاهش این ریسک باید از مواردی مانند:

  • HTTPS
  • Cookieهای امن
  • HttpOnly
  • SameSite
  • Session ID تصادفی و مناسب
  • بازتولید Session ID بعد از Login
  • عدم افشای Session ID
  • مدیریت صحیح Logout

استفاده کنیم.


# تنظیم Cookie امن برای Session

PHP امکان تنظیم ویژگی‌های امنیتی Cookie Session را فراهم می‌کند.

برای مثال:


session_set_cookie_params([

    'secure' => true,

    'httponly' => true,

    'samesite' => 'Lax',

]);



session_start();

secure

اگر:


'secure' => true

باشد، Cookie فقط روی اتصال HTTPS ارسال می‌شود.

بنابراین سایت باید HTTPS داشته باشد.

httponly

با:


'httponly' => true

JavaScript معمولی صفحه نمی‌تواند مستقیماً Cookie را از طریق document.cookie بخواند.

این گزینه می‌تواند ریسک سرقت Cookie از طریق برخی سناریوهای XSS را کاهش دهد، هرچند جایگزین جلوگیری از XSS نیست.

samesite

گزینه SameSite به کنترل ارسال Cookie در درخواست‌های Cross-Site کمک می‌کند.

برای مثال:


'samesite' => 'Lax'

یک تنظیم رایج برای بسیاری از سایت‌ها است.

انتخاب مقدار مناسب به معماری و نیازهای سایت بستگی دارد.


# Session Timeout چیست؟

در بعضی سیستم‌ها می‌خواهیم اگر کاربر برای مدت مشخصی فعالیت نکرد، Session او منقضی شود.

می‌توانیم زمان آخرین فعالیت را ذخیره کنیم:


<?php



session_start();



$timeout = 1800; // 30 دقیقه



if (isset($_SESSION['last_activity'])) {



    if (time() - $_SESSION['last_activity'] > $timeout) {



        $_SESSION = [];



        session_destroy();



        header('Location: login.php');

        exit;

    }

}



$_SESSION['last_activity'] = time();

در این مثال اگر بیشتر از ۳۰ دقیقه از آخرین فعالیت کاربر گذشته باشد، Session حذف می‌شود.

البته در پروژه‌های واقعی باید Timeout را متناسب با نوع سیستم، سطح حساسیت اطلاعات و تجربه کاربری تنظیم کرد.


# آیا Session خودش بعد از بستن مرورگر حذف می‌شود؟

این موضوع به تنظیمات Session Cookie و نحوه پیکربندی PHP بستگی دارد.

به طور معمول Session Cookie می‌تواند یک Cookie موقت باشد که با پایان عمر مرورگر دیگر در دسترس نیست.

اما باید توجه کنیم که:

بستن مرورگر الزاماً به معنی حذف فوری اطلاعات Session از سمت سرور نیست.

مدیریت طول عمر Session در سمت سرور و Cookie Session دو موضوع مرتبط اما متفاوت هستند.


# Session در PHP کجا ذخیره می‌شود؟

در حالت معمول، PHP اطلاعات Session را با یک Session Handler مدیریت می‌کند و یکی از روش‌های رایج، ذخیره Sessionها در فایل‌های سمت سرور است.

اما PHP می‌تواند از Session Handlerهای دیگری نیز استفاده کند.

برای مثال در معماری‌های بزرگ ممکن است Session در:

  • Redis
  • Database
  • Memcached
  • یا سیستم‌های ذخیره‌سازی دیگر

مدیریت شود.

این موضوع زمانی اهمیت پیدا می‌کند که برنامه روی چند سرور اجرا شود.


# Session در پروژه‌های چند سروره

فرض کنید سایت شما روی دو سرور اجرا می‌شود:


Server 1

Server 2

اگر Sessionها فقط روی دیسک Server 1 ذخیره شوند، ممکن است درخواست بعدی کاربر به Server 2 برسد و Server 2 نتواند Session را پیدا کند.

در چنین معماری‌هایی معمولاً باید از روش‌هایی مانند Shared Session Storage استفاده کرد.

مثلاً:


Application Servers

      ↓

    Redis

      ↓

Session Data

در این معماری هر دو سرور می‌توانند به یک محل مشترک برای Session دسترسی داشته باشند.


# چه اطلاعاتی را داخل Session ذخیره کنیم؟

Session برای ذخیره اطلاعات موقت و ضروری مناسب است.

مثلاً:


$_SESSION['user_id'] = 25;

$_SESSION['role'] = 'admin';

اما بهتر است اطلاعات زیادی داخل Session ذخیره نکنیم.

مثلاً معمولاً لازم نیست اطلاعات کامل کاربر، لیست سفارش‌ها یا داده‌های بزرگ را در Session قرار دهیم.

بهتر است شناسه کاربر را نگه داریم:


$_SESSION['user_id'] = 25;

و اطلاعات مورد نیاز را هنگام نیاز از Database دریافت کنیم.


# چه اطلاعاتی را نباید در Session ذخیره کنیم؟

از ذخیره اطلاعات حساس یا غیرضروری باید تا حد امکان جلوگیری کنیم.

برای مثال:


$_SESSION['password'] = '...';

کار مناسبی نیست.

همچنین نباید Session را به محلی برای نگهداری حجم زیادی از داده تبدیل کنیم.

Session بهتر است برای State مورد نیاز کاربر استفاده شود، نه به عنوان جایگزین Database.


# تفاوت Session و Cookie در PHP

Session و Cookie هر دو برای مدیریت وضعیت کاربر استفاده می‌شوند، اما تفاوت مهمی دارند.

ویژگیSessionCookie
محل اصلی نگهداری دادهمعمولاً سرورمرورگر
ارسال با هر درخواستSession ID معمولاً ارسال می‌شودCookie ارسال می‌شود
مناسب برای Loginبلهمی‌تواند در کنار Session استفاده شود
ظرفیتوابسته به Storage سمت سرورمحدودتر
کنترل مستقیم توسط کاربرکمتربیشتر
مناسب برای داده حساسبهتر است داده اصلی سمت سرور باشدبرای داده حساس مناسب نیست

به زبان ساده:


Cookie → اطلاعات/شناسه در مرورگر

Session → اطلاعات Session معمولاً در سرور


# تفاوت Session و JWT چیست؟

Session و JWT هر دو می‌توانند برای مدیریت Authentication استفاده شوند، اما معماری آن‌ها متفاوت است.

در Session معمولاً:


Browser

   ↓

Session ID

   ↓

Server

   ↓

Session Data

اما در JWT:


Browser

   ↓

JWT

   ↓

Server

   ↓

بررسی Signature و Claims

JWT معمولاً برای APIها و معماری‌هایی که به Token-based Authentication نیاز دارند کاربرد زیادی دارد.

Session نیز برای بسیاری از وب‌سایت‌های معمولی و سیستم‌های مبتنی بر Cookie انتخاب طبیعی و ساده‌ای است.

هیچ‌کدام به صورت مطلق جایگزین دیگری نیستند؛ انتخاب روش به معماری برنامه بستگی دارد.


# Session در APIها

Session می‌تواند در API نیز استفاده شود، اما بسیاری از APIها به جای Session از روش‌های Token-based مانند JWT یا Access Token استفاده می‌کنند.

برای مثال:


Authorization: Bearer TOKEN

در این حالت سرور Token را بررسی می‌کند.

در مقابل، یک برنامه وب سنتی ممکن است Session Cookie را همراه درخواست ارسال کند.

بنابراین قبل از انتخاب Session یا Token باید معماری برنامه را مشخص کنیم.


# Session و CSRF

اگر احراز هویت سایت شما بر پایه Cookie و Session باشد، باید موضوع CSRF را نیز جدی بگیرید.

فرض کنید کاربر وارد حساب خود شده و Session Cookie معتبر دارد.

یک درخواست مخرب می‌تواند تلاش کند کاربر را وادار به ارسال یک درخواست ناخواسته به سایت کند.

برای مقابله با CSRF معمولاً از مکانیزم‌هایی مانند:


CSRF Token

استفاده می‌شود.

بنابراین استفاده از Session به تنهایی به معنی امن بودن سیستم Authentication نیست.


# Session و XSS

حملات XSS نیز می‌توانند روی امنیت Session تأثیر بگذارند.

به همین دلیل استفاده از:


'httponly' => true

برای Cookie Session می‌تواند یک لایه دفاعی مهم باشد.

اما نباید تصور کنیم HttpOnly تمام مشکلات XSS را حل می‌کند.

همچنان باید ورودی‌ها و خروجی‌های برنامه به شکل صحیح مدیریت و Escape شوند.


# یک نمونه Login امن‌تر با Session

یک نمونه ساده‌تر و اصولی‌تر می‌تواند چنین ساختاری داشته باشد:


<?php



session_set_cookie_params([

    'secure' => true,

    'httponly' => true,

    'samesite' => 'Lax',

]);



session_start();



// فرض کنید اطلاعات کاربر از Database دریافت شده است.



$user = [

    'id' => 25,

    'password' => '$2y$10$example-hashed-password'

];



$password = $_POST['password'] ?? '';



if (password_verify($password, $user['password'])) {



    session_regenerate_id(true);



    $_SESSION['user_id'] = $user['id'];

    $_SESSION['last_activity'] = time();



    echo "ورود موفق بود.";



} else {



    echo "رمز عبور اشتباه است.";

}

در یک پروژه واقعی، اطلاعات کاربر باید از Database و با Queryهای امن دریافت شود.


# ساخت Logout اصولی

می‌توانیم Logout را در فایلی مانند:


logout.php

قرار دهیم:


<?php



session_start();



$_SESSION = [];



if (ini_get('session.use_cookies')) {



    $params = session_get_cookie_params();



    setcookie(

        session_name(),

        '',

        time() - 42000,

        $params['path'],

        $params['domain'],

        $params['secure'],

        $params['httponly']

    );

}



session_destroy();



header('Location: login.php');

exit;

این کد ابتدا داده‌های Session را پاک می‌کند، Cookie مربوط به Session را منقضی می‌کند و در نهایت Session را Destroy می‌کند.


# بهترین روش‌های امنیت Session در PHP

برای داشتن Session امن‌تر، موارد زیر را در نظر بگیرید:

1. همیشه از HTTPS استفاده کنید

اطلاعات Login و Session نباید از طریق اتصال ناامن منتقل شوند.

2. بعد از Login موفق Session ID را تغییر دهید


session_regenerate_id(true);

3. Cookie Session را HttpOnly کنید


'httponly' => true

4. برای HTTPS گزینه Secure را فعال کنید


'secure' => true

5. SameSite را متناسب با معماری تنظیم کنید

مثلاً:


'samesite' => 'Lax'

6. اطلاعات غیرضروری داخل Session ذخیره نکنید

مثلاً:


$_SESSION['user_id'] = 25;

معمولاً بهتر از ذخیره حجم زیادی از اطلاعات کاربر است.

7. Session را بعد از Logout نابود کنید


session_destroy();

8. Session Timeout مناسب داشته باشید

به‌خصوص برای سیستم‌های حساس.

9. Session ID را در URL قرار ندهید

تا حد امکان Session ID باید از طریق Cookie مدیریت شود، نه URL.

10. از Session برای ذخیره رمز عبور استفاده نکنید

رمز عبور باید به شکل Hash امن در Database نگهداری شود.


# اشتباهات رایج در استفاده از Session

اشتباه اول: فراموش کردن session_start()

مثلاً:


$_SESSION['user_id'] = 25;

بدون اینکه Session را شروع کرده باشیم.

باید ابتدا:


session_start();

اجرا شود.


اشتباه دوم: قرار دادن session_start بعد از خروجی

مثلاً:


echo "Hello";



session_start();

ممکن است باعث مشکل Header شود.


اشتباه سوم: ذخیره اطلاعات بیش از حد

Session نباید جای Database را بگیرد.


اشتباه چهارم: عدم تغییر Session ID بعد از Login

در سیستم‌های Authentication بهتر است بعد از Login موفق:


session_regenerate_id(true);

اجرا شود.


اشتباه پنجم: تصور اینکه Session کاملاً امن است

Session فقط یک ابزار مدیریت وضعیت است.

امنیت واقعی سیستم به موارد زیادی مانند:

  • HTTPS
  • مدیریت Cookie
  • CSRF Protection
  • جلوگیری از XSS
  • مدیریت Password
  • کنترل دسترسی
  • Session ID
  • Timeout

وابسته است.


# Session در PHP چه زمانی مناسب است؟

Session انتخاب مناسبی برای بسیاری از وب‌سایت‌هایی است که نیاز دارند وضعیت کاربر را بین درخواست‌های مختلف حفظ کنند.

مثلاً:

  • سیستم ورود کاربران
  • پنل کاربری
  • سبد خرید
  • نگهداری پیام‌های موقت
  • فرم‌های چندمرحله‌ای
  • Flash Message
  • مدیریت وضعیت موقت کاربر

برای مثال سبد خرید ساده:


session_start();



$_SESSION['cart'] = [

    10 => 2,

    25 => 1,

];

در این مثال می‌توانیم شناسه محصولات و تعداد آن‌ها را در Session نگه داریم.

البته برای فروشگاه‌های بزرگ، بهتر است معماری سبد خرید بر اساس نیازهای واقعی سیستم طراحی شود.


# Session Flash Message چیست؟

گاهی می‌خواهیم یک پیام فقط در درخواست بعدی نمایش داده شود.

مثلاً بعد از ثبت موفق فرم:


$_SESSION['success'] = 'اطلاعات با موفقیت ذخیره شد.';

سپس در صفحه بعد:


if (isset($_SESSION['success'])) {



    echo $_SESSION['success'];



    unset($_SESSION['success']);

}

به این نوع الگو معمولاً Flash Message گفته می‌شود.

فریم‌ورک‌هایی مانند Laravel این مفهوم را به شکل آماده و حرفه‌ای در اختیار برنامه‌نویس قرار می‌دهند.


# Session در PHP و Laravel

در PHP خام، معمولاً با:


session_start();

و:


$_SESSION

کار می‌کنیم.

اما Laravel یک سیستم Session سطح بالاتر در اختیار ما قرار می‌دهد.

برای مثال:


session(['user_id' => 25]);

و برای دریافت:


$userId = session('user_id');

یا:


$request->session()->put('user_id', 25);

بنابراین دانستن Session در PHP خام، پایه خوبی برای درک Session در Laravel نیز ایجاد می‌کند.


# جمع‌بندی

Session یکی از مهم‌ترین قابلیت‌های PHP برای مدیریت وضعیت کاربران بین درخواست‌های مختلف است.

با Session می‌توانیم اطلاعاتی مانند:


$_SESSION['user_id'] = 25;

را نگهداری کنیم و در درخواست‌های بعدی از آن استفاده کنیم.

مهم‌ترین مفاهیمی که در این مقاله یاد گرفتیم عبارت‌اند از:

  • session_start()
  • $_SESSION
  • session_id()
  • session_regenerate_id()
  • session_unset()
  • session_destroy()
  • Session Cookie
  • Session ID
  • Session Fixation
  • Session Hijacking
  • Session Timeout
  • Session Security
  • تفاوت Session و Cookie
  • تفاوت Session و JWT

اگر قصد ساخت سیستم Login در PHP را دارید، Session یکی از مفاهیم پایه‌ای است که باید به خوبی آن را یاد بگیرید.

در ادامه مسیر یادگیری PHP، بعد از Session، شناخت Cookie در PHP اهمیت زیادی دارد؛ زیرا Cookie و Session ارتباط نزدیکی با یکدیگر دارند و در سیستم‌های Login، احراز هویت و نگهداری وضعیت کاربر بسیار مورد استفاده قرار می‌گیرند.

سوالات متداول

Session در PHP چیست؟

Session مکانیزمی برای نگهداری وضعیت و اطلاعات مربوط به کاربر بین درخواست‌های مختلف است. اطلاعات Session معمولاً در سمت سرور نگهداری می‌شوند و Session ID برای شناسایی آن Session استفاده می‌شود.

برای شروع Session در PHP از چه تابعی استفاده می‌شود؟

از تابع:


session_start();

استفاده می‌شود.

اطلاعات Session در PHP با چه متغیری ذخیره می‌شوند؟

از Superglobal زیر استفاده می‌شود:


$_SESSION

چگونه Session را حذف کنیم؟

برای نابودی Session می‌توان از:


session_destroy();

استفاده کرد. برای Logout کامل بهتر است داده‌های $_SESSION و Cookie مربوط به Session نیز به شکل مناسب پاک شوند.

آیا Session از Cookie امن‌تر است؟

Session و Cookie کاربردهای متفاوتی دارند. در Session، داده اصلی معمولاً سمت سرور نگهداری می‌شود و مرورگر Session ID را نگه می‌دارد. امنیت نهایی به نحوه پیاده‌سازی، HTTPS، تنظیمات Cookie و سایر مکانیزم‌های امنیتی بستگی دارد.

Session بهتر است یا JWT؟

هیچ پاسخ عمومی برای همه پروژه‌ها وجود ندارد. Session برای بسیاری از وب‌سایت‌های سنتی مناسب است و JWT در بسیاری از معماری‌های API و Token-based Authentication کاربرد دارد. انتخاب باید بر اساس معماری پروژه انجام شود.

آیا Session بعد از بستن مرورگر حذف می‌شود؟

لزوماً نه. طول عمر Cookie و اطلاعات Session در سمت سرور دو موضوع متفاوت هستند و رفتار دقیق آن‌ها به تنظیمات PHP و Session Handler بستگی

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه