【问题标题】:php session sometimes not avaliable after passing to another domainphp 会话有时在传递到另一个域后不可用
【发布时间】:2012-10-03 00:04:16
【问题描述】:

我经营的网站可以通过不同的域访问:domainname.de、domainname.ch、domainname.at、domainname.es 等...

当我的客户想要付款时,我们会进入一个当然是 https 安全的付款页面。由于服务器限制,我只能拥有一个 SSL 证书,我只将其放在一个域上:domainname-secure.com。

因为我收取不同的价格,所以我需要知道用户属于哪个域,所以在重定向到 domainname-secure.com 时,我将域(例如 domainname.de)保存在会话变量 $_SESSION['domain_default'] 中并通过 sessionID 传递添加session_id=[session_id] 作为获取参数。

然后我检查我接受$_GET['session_id'] 并运行以下命令以使会话在 domainname-secure.com 上可用:

session_id($_GET['session_id']);

session_start();

当我自己测试它时,它工作得非常好,但是当有人访问 domainname-secure.com 并且没有设置 $_SESSION['domain_default'] 时,我会创建一个日志条目。

这种情况每天发生几次,但我真的不知道为什么这不起作用!我正在从许多不同的链接一次又一次地对其进行测试,但对我来说它工作得非常好。

你们中的一些人能想象为什么它有时不起作用吗?

将会话 ID 传递到另一个域是不是“好”或不安全,重定向后它不是总是可读的吗?

我知道你很难确定一个错误,但我正在寻找一些关于会话的已知问题,或者可能是如何以更好的方式做到这一点的提示?

【问题讨论】:

  • 您的服务器设置是否包含 suhosin 补丁集?
  • 为什么不直接将域添加到数据库中的用户?那么你就不需要这种不必要的复杂设置了。
  • @jeroen 他想获取他存储在$_SESSION 中的数据。这就是他通过 get 传递 session_id 的原因。我假设他从$_SESSION 变量中获得了一些其他信息,除了原始域。否则他也可以将域名放在$_GET 参数中。
  • @Mihai Stancu 不,$_GET 可以被操纵,如果用户属于某个域,则 db 是设置它的地方。除此之外,您不希望您的客户跳到另一个网站以获得更低的价格......
  • 感谢您到目前为止的回答! @jeroen,但我在 SESSION 中还有其他信息需要访问

标签: php session ssl


【解决方案1】:

会话由 PHP 基于每个域进行管理,这意味着它们不会有意混合域。

如果您将使用其他会话存储机制,例如写入数据库或使用 memcached 会话,您将能够克服此限制。

如果您希望在更改域时能够访问会话信息,有两种方法:

  • 不要使用 PHP 的 $_SESSION,使用 memcached/redis/sql 设置自己的会话管理;

或者:

  • 使用 PHP 的 $_SESSION,但是当从一个域传输到另一个域时,序列化 $_SESSION 中的数据,并将其放在两个域都可以访问的位置,例如 sql;

【讨论】:

  • 感谢您的回答。但这不是可以通过 get 参数传递 session_id(除了可以禁用 cookie)来克服此限制的原因吗?
  • 不,这就是为什么即使您通过 $_GET 传递 session_id 您将无法访问其他域会话文件的原因 - 它们是分开的。跨度>
  • 但它适用于我.. 我只收到错误消息,它不适用于其他人。这和浏览器无关吧?
  • 然后发布错误消息。不,它与浏览器无关,除非您使用 $_COOKIES 而不是 $_SESSION。
  • 我没有收到错误消息,因为我只知道我的某些客户无法使用会话,然后我还保存了会话 ID。这就是我在客户访问一页时检查的内容。就像我说的,我也是在出错的时候保存了session id,当我尝试使用他的session id并把它放在url中,这样程序就使用了session id,我就登录了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多