【问题标题】:session_id() behaviour [duplicate]session_id() 行为 [重复]
【发布时间】:2012-08-13 03:14:58
【问题描述】:

出于各种原因,我一直致力于将我的网站会话信息从平面文件转换为数据库会话,主要原因是我为管理面板和用户面板使用相同的用户数据库。

管理面板设置在我们主域的子域上,即;

domain.com staff.domain.com

两个域都使用完全相同的会话处理程序,但是在子域和普通域上实际创建会话时,会为同一台计算机/人创建两个不同的 session_id。

这种行为正常吗?有没有办法让我登录用户面板也允许我在不登录的情况下使用人员面板,因为会话已经创建?

谢谢

【问题讨论】:

  • 你能给我们看看你的会话处理程序的片段吗?
  • @John 你想要什么 sn-p,创建/更新我假设的会话?

标签: php session sessionid


【解决方案1】:

您可以从您的 PHP 脚本中设置:

ini_set('session.cookie_domain', '.domain.tld');

为了跨子域共享会话。

您将会话存储到 DB 中这一事实不应该直接与此功能有关,因为我假设您正在使用一个类来包装会话读/写功能,这要归功于 session_set_save_handler 之类的东西。

【讨论】:

    【解决方案2】:

    我假设您正在使用 cookie 来传输会话 ID。 cookie 不会被传递到网站的其他部分,因为它位于不同的(子)域中。因此 PHP 会生成一个新的会话 id。

    但是,如果您设法使两个部分具有相同的会话名称并且您设法传递会话 ID,那么一切都应该正常工作。

    例如,您可以创建一个接受会话 ID 作为参数的特殊脚本,然后接管该会话数据。

    但是在这里要小心,这样就不会轻易被滥用来窃取会话。因此,可能使用适用于两个站点的 cookie 可能是一个更简单的解决方案。

    【讨论】:

    • 您好,如果我的操作正确,为了让我能够做到这一点,我将不得不使用 cookie,让 cookie 名称类似于“login-id”,然后包含加密的 session_id?谢谢!
    • @JakeBall:您已经在使用 cookie 作为传输会话 ID 的机制。您需要做的是确保 cookie 适用于两个子域。
    • @Jon 谢谢你,我总是把会话放在我身后,因为我发现它们非常令人困惑,除了 cookie。我会考虑所有建议,仔细阅读相应功能的文档,然后再次对此进行破解。谢谢!
    • @JakeBall:我在上面发布了一个可能的副本,我认为这是关于会话 cookie(以及配置它的相关潜在问题)。对于 cookie,我建议您只需访问您的会话站点,然后了解浏览器的功能以向您显示所有 cookie。这应该会给你一些重要的见解。您还可以跟踪网络流量并查看在请求和响应中传递的 cookie。您当然甚至可以自己注入会话 cookie,这样可能会更节省 :) 也不要忘记在重要点重新生成会话 id。
    【解决方案3】:

    在每种情况下开始会话之前,您需要调用session_set_cookie_params 并适当地设置会话cookie 的域。文档准确地描述了需要做什么。

    【讨论】:

      【解决方案4】:

      如果您使用 cookie 来存储会话 ID,那么您需要确保使用子域通配符值设置您的 cookie。也就是说,默认情况下,PHP 使用完整的子域和域名设置 cookie(即 cookie 域是“www.domain.com”)。如果您使用“.domain.com”域设置 cookie。 'domain.com' 的所有子域都可以读取 cookie。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-31
        • 2011-10-02
        • 1970-01-01
        • 2022-01-14
        • 2016-04-08
        • 2015-02-02
        • 2012-12-20
        • 2011-05-29
        相关资源
        最近更新 更多