You are currently viewing از دست رفتن PHP SESSION
از دست رفتن PHP SESSION

از دست رفتن PHP SESSION

از دست رفتن اتفاقی PHP Session موضوعی نیست که هر روز با آن مواجه شوید، اما وقتی با آن برخورد کنید می‌تواند واقعاً گیج‌کننده باشد. در این پست، تجربه‌ای شخصی را از چنین مشکلی به اشتراک می‌گذارم و راه‌حل‌هایی برای پیشگیری و رفع آن ارائه می‌دهم.

🚨 مشکل: CSRF Token نامعتبر پس از چندبار Submit

در یکی از پروژه‌هایم متوجه شدم که CSRF Token در اولین بار ارسال فرم معتبر بود، ولی در بار سوم نامعتبر شد. بررسی دقیق‌تر نشان داد که اطلاعات ذخیره‌شده در $_SESSION به‌صورت اتفاقی از بین می‌روند.

🔍 سرنخ: خطای مرورگر در مورد SameSite

در مرورگر Firefox با این هشدار مواجه شدم:

Cookie “PHPSESSID” does not have a proper “SameSite” attribute value. Soon, cookies without the “SameSite” attribute or with an invalid value will be treated as “Lax”. This means that the cookie will no longer be sent in third-party contexts. If your application depends on this cookie being available in such contexts, please add the “SameSite=None“ attribute to it.

از دست رفتن اتفاقی PHP SESSION

این پیام به ما می‌گوید که اگر مقدار SameSite به‌درستی تنظیم نشده باشد، مرورگر در برخی درخواست‌ها (مثلاً فرم‌هایی که از دامنه دیگر ارسال شده‌اند یا پس از رفرش مکرر) کوکی مربوط به Session را ارسال نخواهد کرد.

✅ راه‌حل: تنظیم صحیح پارامترهای کوکی PHP Session

با اضافه کردن کد زیر قبل از فراخوانی session_start() می‌توانید از حذف ناخواسته Session جلوگیری کنید:

session_set_cookie_params([ 'lifetime' => 3600, 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => true, 'httponly' => true, 'samesite' => 'None'
]);
session_start();

🔸 اگر سایت شما روی HTTP (غیر امن) اجرا می‌شود، مقدار secure را به false تغییر دهید، و از 'Lax' به‌جای 'None' برای SameSite استفاده کنید، زیرا 'None' فقط با secure: true قابل استفاده است.

💡 راه‌حل پیشرفته‌تر: ذخیره Session در متغیر static

اگر مشکل شما با راه‌حل بالا هم رفع نشد، استفاده از یک متغیر static در کلاس Header پروژه می‌تواند مفید باشد.

در کلاس header پروژه خودتان یک ویژگی static با نام $session ایجاد نمایید. و سپس کدهای زیر را به کلاس اضافه نمایید:

public function __construct() { session_set_cookie_params([ 'lifetime' => 3600, 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => true, 'httponly' => true, 'samesite' => 'None' ]); session_start(); self::$session = $_SESSION; session_write_close();
} public static function writeSessionData(string $key, mixed $data) { session_start(); $_SESSION[$key] = $data; self::$session = $_SESSION; session_write_close();
}

اکنون به‌جای استفاده مستقیم از $_SESSION در پروژه، از متد writeSessionData استفاده کنید:

header::writeSessionData('user_id', $user_id);

و فراخوانی مستقیم session_start() را در دیگر فایل‌ها حذف نمایید تا از بروز تداخل جلوگیری شود.

📌 جمع‌بندی

مشکل اصلی از سمت مرورگر و تنظیمات کوکی PHP بود، نه کد سمت سرور. توجه به خطاهای مرورگر (DevTools) بسیار کلیدی است. همچنین اگر ساختار پروژه پیچیده‌تر باشد، مدیریت Session با استفاده از کلاس و متدهای استاتیک قابل اعتمادتر است.

بیشتر بخوانید

دیدگاهتان را بنویسید