0

我在两个不同的 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'])设置会话并获取变量。然后它继续在顶部显示一个带有管理功能的栏。

该系统在我的一台主机以及我的本地主机上运行良好。但我最近转移到另一台主机并成功安装了我的 CMS 与相同的代码。除此功能外,一切正常。当我单击链接并尝试设置 session_id 时,session_id 会更改,但$_SESSION变量会被删除。当我返回我的 CMS 时,我必须重新登录。不知何故,在这台主机上,更改 session_id 会删除$_SESSION变量。

我从不喜欢会话变量,如果我要重新开始,我不会使用它们(我可能会使用纯 cookie)。但我真的需要弄清楚这一点。它工作的主机是 Bluehost,两个域都由 Bluehost 托管。它不工作的主机是[EDIT]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。

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

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

感谢您的时间!

更新

我最终从我的 CMS 中删除了它。现在,我只需通过 url 传递登录详细信息,它就会将人登录。它工作得更干净。

4

2 回答 2

3

以下是这可能不起作用的一些原因:

  • 不同的物理服务器
  • 每个域的不同帐户(即使它是相同的物理服务器)
  • 域不同的apache/php守护进程(一些共享主机站点会为每个域创建一个单独的目录,然后限制apache在域之间共享信息。这也会起到阻止会话信息传递的效果。想想看——您是否希望同一托管服务提供商上的其他人的域能够访问您客户的会话信息?)
  • 配置(apache 或 php),或 .htaccess 规则

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

我的猜测是托管服务提供商足够聪明,可以保护会话信息表格被从另一个域窃取。但无论哪种情况,我都强烈建议您更改代码,以便它不需要从另一个域窃取会话信息。

于 2012-10-03T15:39:22.193 回答
0

要在多个域上进行会话,您需要在 url 中传递会话 id 而不是会话 cookie,因为 cookie 仅在单个域的基础上工作。

如果他们不是单独的客户,使用子域将解决问题a.domain.com and b.domain.com

于 2012-10-03T15:40:13.817 回答