از دست رفتن اتفاقی 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.

این پیام به ما میگوید که اگر مقدار 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 با استفاده از کلاس و متدهای استاتیک قابل اعتمادتر است.