【问题标题】:Same Server, Different Domains Require Different Sessions相同的服务器,不同的域需要不同的会话
【发布时间】:2011-01-15 06:28:49
【问题描述】:

我正在为与单个数据库通信的多个域实现登录和注册 - 我们将它们称为 i.domain-a.comi.domain-b.com。这两个子域在 DNS 中都有指向单个服务器的 A 记录 - 从而使 i.domain-a.com/hello.phpi.domain-b.com/hello.php 运行相同的东西。

因此,如果我在域 A 上创建会话,那么我可以转到域 B 并检索相同的会话信息。要为它们实现完全独立的登录系统,使用我编写的用于处理注册的相同 PHP 函数,我是否应该基于 $_SERVER['HTTP_HOST']session_name() 做一些事情?我不确定我的情况与this guy 有多相似,希望这个问题不要太相似。

【问题讨论】:

  • 我想另外,我应该问:如果为每个域使用不同的session_name() 不是一个明智的选择,那么处理这个问题的最佳方法是什么?
  • 您还可以在每个域的 php 应用程序的第一行设置“session.cookie_domain”[type:string] 运行时指令 (init_set())(我的答案在下面,但使用了一个调用到 session_name() 函数)

标签: php session dns subdomain


【解决方案1】:

为避免会话出现问题,您应该使用 session_name('myapplication') [ session_name({UNIQUE_APP_ID}) ]。

您提到的问题可能发生在更简单的情况下,即网站用户有一个管理面板和一个登录表单。

如果未使用 session_name,则登录用户可以访问管理员。面板 但这取决于身份验证。您已实施的方案和机制

问候,

【讨论】:

    【解决方案2】:

    会话/cookies 是特定于域的,不依赖于 DNS 设置。如果您希望两个系统的会话是分开的,而它们位于不同的域中,那么您已经准备就绪。

    我相信 session_name() 实际上是解决其他人问题的最佳解决方案,在同一域上进行两个单独的会话。

    【讨论】:

    • 谢谢。我有一个调试页面,它现在只显示会话 ID,如果我转到 i.domain-a.com/session.phpi.domain-a.com/session.php,我会看到同样的事情。如果我在session_start(); 之前执行session_name($_SERVER['HTTP_HOST']);,那么每个域都会得到不同的ID。
    • 那是因为 i.domain-a.com/session.php 和 i.domain-a.com/session.php 是同一个页面。
    • 会话 ID 是特定于服务器的,但是 cookie 是特定于域的。用户的 cookie(每个域一个)都将指向唯一的会话 ID,从而避免任何重叠。尝试设置一个设置会话变量的脚本和一个显示该变量的脚本。从一个域运行第一个,从另一个域运行第二个,第二个永远不应该获得第一个的值,直到它从同一个域运行。
    • 如果有人将会话 ID 手动传递到 PHP 脚本中,他们可以(如果您想提供此功能,您也可以)跨域传输会话数据。为了完全防止这种情况,您绝对可以使用 session_name()/HTTP_HOST 组合。
    【解决方案3】:

    没有。阻止不同用户获得相同会话的机制是基于每个服务器而不是每个主机名工作的。

    【讨论】:

    • 因此,考虑到这一点,在session_start(); 之前执行session_name($_SERVER['HTTP_HOST']); 是否可以安全地将同一服务器上每个域的会话分开?
    • 我还意识到,实现上述操作会导致每次访问都会生成一个新 ID,这并不理想。我想要相同的 ID,直到会话过期或被销毁。对于如此迅速的回复,我们深表歉意……
    猜你喜欢
    • 2017-09-26
    • 2017-04-14
    • 2012-01-30
    • 2010-11-11
    • 2011-02-05
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2017-09-30
    相关资源
    最近更新 更多