【问题标题】:Variable name overwrites session name变量名称覆盖会话名称
【发布时间】:2012-12-29 17:12:37
【问题描述】:

所以我有几个子域共享同一个会话,对吗?

在子域 1(用户面板、编辑信息等)上:

$_SESSION['user_id'] = 4;

在子域 2 上(参见用户配置文件):

$user_id = 8;

返回子域 1:

echo $_SESSION['user_id']; // output: 8!

$_SESSION['user_id'] 是如何设置为 id 8 的?

希望能学到新东西^_^

【问题讨论】:

  • 也许你可以看看这个? php.net/manual/en/function.setcookie.php
  • @BogdanBurim 虽然通常是这样,但不一定是这样。
  • 听起来register_globals 在您的部分(或全部)网站中启用:-?
  • @ÁlvaroG.Vicario。谢谢!这就是原因。我一直都知道 register_globals 是一个安全问题,但我自己从未经历过。但现在我知道了:)如果你回答我会接受

标签: php session variables overwrite


【解决方案1】:

您描述的症状让我怀疑您的部分(或全部)站点中启用了register_globals。当$_SESSION 数组中的项目成为全局变量时,您会遇到这种问题。

【讨论】:

    【解决方案2】:

    从您的代码中并不完全清楚(您的意思是第二个代码 sn-p 中的 $_SESSION['user_id'] = 8; 吗?),但如果您有两个共享 cookie 并具有相同会话 ID 的子域(并使用 cookie 进行会话),然后你可以修改两者之间的会话。

    这可以通过在执行任何与会话相关的事情(或输出任何内容)之前设置会话 cookie 域,或者通过在 php.ini 中为 cookie 域设置配置选项来实现。

    如果您以其他方式(例如 URL)传递会话 ID,并在子域之间共享它,这也可能发生。

    【讨论】:

    • 我确实设置了会话 cookie 域以便能够共享会话。您阅读的代码是正确的。我设置了一个 $user_id。但是在子域 2 上,会话['user_id'] 没有干扰。
    【解决方案3】:

    您只需执行以下操作:

    $_SESSION['sub_domain1]['user_id'] = 8;
    $_SESSION['sub_domain2]['user_id'] = 4;
    

    这是使用 Zend Framework 的名称页处理会话的解决方案。 您可以创建类:My_Session__contruct($namespace),然后写入方法:getset 以从键中获取您的值。

    更新:
    http://framework.zend.com/manual/1.12/en/zend.session.basic_usage.html

    【讨论】:

    • 酷,这确实是防止某些会话干扰其他会话的好方法,但不是我的问题的原因。 (register_globals 是)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多