session_id()没有得到会话变量

时间:2012-10-03 15:20:50

标签: php session hosting session-variables

我在两个不同的Web服务器上安装了自制CMS。每个都保持相同的代码。当我尝试在不同域之间传递$_SESSION变量时,我遇到了一个非常烦人的问题。

我的CMS在domain1.com上。它控制的网站在domain2.com上。我的系统通过url链接将登录信息的所有会话变量从domain1.com传递到domain2.com(domain1.com有这样的链接:http://domain2.com?sessionId=1gh...)(sessionId由session_id()生成)。 domain2.com检索会话ID并执行session_id($_GET['sessionId'])设置会话并获取变量。然后它会在管理员功能的顶部显示一个栏。

此系统适用于我的某个主机以及我的localhost。但是我最近转移到另一台主机并使用相同的代码安装了我的CMS并取得了成功。除此功能外,一切正常。当我单击链接并尝试设置session_id时,session_id会更改,但$_SESSION变量将被删除。当我回到我的CMS时,我必须重新登录。不知何故,在这台主机上,更改session_id会删除$_SESSION变量。

我从来没有喜欢会话变量,如果我再次开始我就不会使用它们(我可能会使用普通的cookie)。但我真的需要弄清楚这一点。它运行的主机是Bluehost,两个域都由Bluehost托管。它不能使用的主机是[编辑] ByteHost,域名注册商是Godaddy。

以下是来自domain2.com的一些示例代码:

...

if ( $_GET['sessionId'] )
{
 session_id($_GET['sessionId']);
}

session_start();

echo session_id(); // returns the proper sessionId passed through the url

print_r($_SESSION); // does not work. returns array()

...

我可以保证之前存在$_SESSION个变量,因为我仍然登录了我的CMS。

任何想法为什么会话变量在1个主机上工作,而在另一个主机上不工作?

我尝试用工作主机替换php.ini文件。问题仍然存在。

感谢您的时间!

更新

我最终从我的CMS中删除了这个。现在,我只是通过网址传递登录详细信息,然后将此人记录下来。它的工作方式更加清晰。

2 个答案:

答案 0 :(得分:3)

以下是一些可能无法正常工作的原因:

  • 不同的物理服务器
  • 每个域的不同帐户(即使它是相同的物理服务器)
  • 域名的不同apache / php守护程序(某些共享托管站点将为每个域创建一个单独的目录,然后限制apache在域之间共享信息。这也会起到预防作用会话信息被传递。想一想 - 您是否希望同一主机提供商处的其他人的域可以访问您客户的会话信息?)
  • 配置(apache或php)或.htaccess规则

以下是我的建议:停止这样做。这是修复代码中非常严重的安全漏洞的绝佳机会。当您使用托管服务提供商进行诊断时,您可能只需使用HTML5存储或安全cookie重写您需要的所有内容。

我的猜测是托管服务提供商足够聪明,可以保护从其他域名被盗的会话信息。但在任何一种情况下,我强烈建议您更改代码,以便它不需要从其他域窃取会话信息。

答案 1 :(得分:0)

要在多个域上建立会话,您需要在网址而不是会话Cookie中传递会话ID,因为Cookie仅适用于单个域。

如果子域名不是单独的客户a.domain.com and b.domain.com

,则使用子域名可以解决问题