2014-02-12 141 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

相关问题