首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

IE 瀏覽器 Session 遺失問題:新視窗 Cookie 丟失的實測與解決方案

     編輯:PHP 相關知識

在舊版 IE(IE6/7/8/9)中,使用 JavaScript window.open() 或 target="_blank" 開啟新視窗時,常會發生 Session 遺失、使用者登入狀態消失的問題。經實測分析,根本原因在於 PHP 預設的 Session ID 儲存於「進程級」Cookie(即瀏覽器進程關閉即失效),而舊版 IE 開啟新視窗會啟動獨立進程,導致原視窗的 Session Cookie 無法傳遞至新進程。

問題現象與測試環境

  • IE6/7/8/9 (IETest):均出現 Session 遺失
  • IE10 (Windows 內建):無此問題
  • Chrome / Firefox:多執行緒架構下正常運作,無 Session 遺失

核心原因分析

PHP session_start() 預設產生的 PHPSESSID Cookie 未設定 expire 參數,屬於「會話級 Cookie」(Session Cookie),僅在當前瀏覽器進程有效。舊版 IE 的 window.open 與 target="_blank" 會建立新進程,新進程無法讀取父進程的會話級 Cookie,導致 Session ID 遺失,伺服器無法識別使用者身分。

解決方案:將 Session ID 儲存為持久性 Cookie

在 session_start() 前手動設定帶有過期時間的 Cookie,使 Session ID 跨進程保持有效:

<?php
// 設定 Session ID 為持久性 Cookie(例如 30 天有效)
$lifetime = 30 * 24 * 3600; // 30 天
session_set_cookie_params($lifetime, '/', '', false, true); // 最後參數為 HttpOnly
session_start();

// 也可直接用 setcookie 覆寫 PHPSESSID
setcookie(session_name(), session_id(), time() + $lifetime, '/', '', false, true);
?>

替代方案:URL 重寫傳遞 Session ID

PHP 設定 session.use_trans_sid = 1 可自動將 Session ID 附加到 URL,但僅支援絕對路徑,相對路徑不會自動加入,且會暴露 Session ID 於 URL 中,安全性較低,不建議作為主要方案。

最佳實踐建議

  1. 首選:設定 Session Cookie 為持久性(含 HttpOnly、Secure 標記)
  2. 輔助:關鍵操作頁面驗證 Session 存在性,若遺失則引導重新登入
  3. 長遠:棄用舊版 IE 支援,或引導使用者升級至現代瀏覽器

此問題在現代瀏覽器(IE10+、Chrome、Firefox、Edge)已不存在,若專案仍需支援舊版 IE,請務必在專案初始化階段統一設定 Session Cookie 參數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved