【问题标题】:$_SESSION linking to variable reference across pages?$_SESSION 链接到跨页面的变量引用?
【发布时间】:2015-02-05 20:17:32
【问题描述】:

我的网站上有一个 PHP 会话,用于存储登录信息。数组的基本结构是这样的:

$_SESSION = Array(

    [uid]=>Int
    [acc]=>Array
    [lastAction]=>Timestamp

)

当我在我的登录 PHP 脚本中设置这些会话变量时,我将它们设置为:

$_SESSION["uid"] = $uid;
$_SESSION["acc"] = array(...);
$_SESSION["lastAction"] = time();

直到后来我使用 MySQLi 绑定一些变量的一个脚本之前,这从来没有造成问题。我想从我的一张表中检索uid 变量,所以我继续这样做:

$stmt = $link->prepare("SELECT `uid` ... FROM ...");
...
$stmt->bind_result($uid, ...);

语句运行没有问题,数据全部正确,但现在会话有问题。

显然,$_SESSION["uid"] 仍然与引用 $uid 相关联,即使我现在在不同的页面上并且在设置会话时我没有通过引用传递变量。


为了测试这个理论,我继续设置我的会话并运行以下代码:

<?php

    session_start();
    $uid = 1823479;
    print_r($_SESSION);

?>

果然$_SESSION["uid"]等于1823479。

这是预期的行为吗?我以前从未遇到过这个问题,但由于我没有使用引用设置会话,所以在我看来这不是预期的行为。

附加信息:

PHP 版本:5.3

【问题讨论】:

    标签: php session session-variables pass-by-reference


    【解决方案1】:

    使用 phpinfo() 检查 register_globals 是否设置为“off”。听起来它可能设置为“on”,在这种情况下 $_SESSION["uid"] 将与 $uid 相同。

    In PHP, why are my session variables persisted as references? http://bytes.com/topic/php/answers/759731-register_globals-off-session-side-effect

    【讨论】:

    • 啊。它开着。不过,我觉得这很愚蠢。如果我做了 PHP... ;)
    • 巴姆。做到了。谢谢!
    • 这是一个相当大的安全问题。它在 PHP 4.2.0 中默认设置为“关闭”,因此配置您的服务器的人必须手动启用它。解决方法是尽可能禁用它(强烈推荐),或者使用具有其他名称的变量。
    • 太棒了!感谢您的反馈!
    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多