2014-02-12 138 views
5

我的用戶在Internet Explorer中登錄我的站點時遇到問題(可能是較舊的10和11)。PHP,會話Cookie和Internet Explorer

通過一些試驗和錯誤,我發現IE設置了兩次cookie。在F12開發人員工具欄中輸入document.cookie即可看到。

研究表明,這可能是由於有一個「www」。版本和非www版本的cookie。我不知道如何驗證這一點,但我希望我可以通過調用session_set_cookie_params明確設置域來抵制該問題。

因此我有:

$host = $_SERVER['HTTP_HOST']; 
if(substr($host, 0, 4) === 'www.') $host = substr($host, 4); 
$colon = strrpos($host, ':'); 
if($colon !== false) $host = substr($host, 0, $colon); 
session_set_cookie_params(0, '/', $host); 
session_start(); 

我剝口太(本地主機上開發:81),因爲這是document.domain回報。

主機現在只是localhost(還沒有在網站上試過),我根本無法在IE中登錄。在Firefox中運行良好,不是可以在Chrome中運行。

如何讓PHP或瀏覽器在www子域和網站的子域版本之間共享會話cookie?


我想在那裏每個相關的問題拋出一個點:

$host = $_SERVER['HTTP_HOST']; 
if(substr($host, 0, 4) === 'www.') $host = substr($host, 4); 
$colon = strrpos($host, ':'); 
if($colon !== false) $host = substr($host, 0, $colon); 
session_set_cookie_params(0, '/', '.'.$host); 
session_start(); 

我甩session_get_cookie_params(),以確認它已正確設置。這似乎也不能解決我的問題。會話不斷重置。

+0

你對我所見過的最棒的部分 –

+0

@NullPoiиteя:謝謝。花了幾個月的時間來繪畫。 PS:蝙蝠俠寶寶也很可愛。 – mpen

回答

1

我寫了一個函數來手動解析出cookie字符串,它處理受騙者:

function parse_cookie_str($str = null) { 
    if ($str === null) 
     $str = array_key_exists('HTTP_COOKIE', $_SERVER) 
       ? $_SERVER['HTTP_COOKIE'] 
       : '' 
     ; 

    $kvps = array_map('ltrim', explode(';', $str)); 
    $cookies = array(); 

    foreach ($kvps as $kvp) { 
     list ($name, $value) = explode('=', $kvp); 
     if (array_key_exists($name, $cookies)) { 
      if (!is_array($cookies[$name])) { 
       $cookies[$name] = array($cookies[$name]); 
      } 
      $cookies[$name][] = $value; 
     } else { 
      $cookies[$name] = $value; 
     } 
    } 

    return $cookies; 
} 

如果PHPSESSID是有兩次,我們知道什麼是錯的。該Cookie does not appear to be deletable,讓我們用一些社會工程:

$cookies = parse_cookie_str(); 

$phpsessid = session_name(); 

if (
    isset($cookies[$phpsessid]) 
    && is_array($cookies[$phpsessid]) 
) { // two or more PHPSESSIDs found 
    exit("Your session is corrupt. Please close your browser and try again."); 
} 

既然PHPSESSID問題是固定的,我只需要用戶強制一個子域,這樣的問題不會再次出現。在開始會話之前,必須完成

到目前爲止,這工作。

+1

偉大的人..你拯救了我的一天。我不知道IE瀏覽器正在發生什麼。 – Sanoob

+0

有點這聽起來你正在解決問題的錯誤。我們沒有找出爲什麼IE瀏覽器正在以不正確的方式設置這個cookie(以及如何首先防止它),而是介紹了回顧過程中修復它的代碼。您應該爲您的問題添加更多細節,例如如何將Cookie傳輸到IE上通過HTTP進行設置以及您如何檢查它(JS代碼和調試輸出)以及IE如何通過HTTP將Cookie傳輸到然後服務器再次。 – hakre

+0

@hakre:根據鏈接問題在cookie上設置域名對我來說不起作用。我在這裏發佈的解決方案並不是一個解決方案,它只是檢測到其會話已被炒的任何用戶的問題。發生這種情況的原因是,當用戶第一次訪問該網站時,他們處於非www版本,但我的代碼在檢查子域之前立即設置了會話cookie。然後強制他們到www然後創建第二個會話(在IE中)。解決方案只是在創建會話之前檢查子域。 – mpen

相關問題