【问题标题】:PHP session variable changes between pages页面之间的 PHP 会话变量更改
【发布时间】:2011-04-14 04:57:44
【问题描述】:

我有一个这样设置的会话变量:

<?php
$token = md5(uniqid(rand(), true));
session_start();
$_SESSION['token'] = $token;
print $_SESSION['token'];
?>

然后在另一个页面上我有这个:

<?php
session_start();
print $_SESSION['token'];
?>

问题是它们不匹配。我得到两个完全不同的字符串。 register_globals 已关闭。我确实注意到,当我将md5(....) 设置为常量字符串时,例如:md5('example'),它按预期工作并且两个字符串匹配。但这应该没关系。关于这里发生了什么的任何想法?

编辑:Apache 访问日志:

127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /index.php HTTP/1.1" 200 3182 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /style/style.css HTTP/1.1" 304 - "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /js/signup.js HTTP/1.1" 304 - "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /index.php HTTP/1.1" 200 3182 "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"
127.0.0.1 - - [18/Sep/2010:17:46:10 -0500] "GET /index.php HTTP/1.1" 200 3182 "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3"

我不太确定如何阅读它,但在我看来,我的文件(我认为是“/”的 index.php)被调用了 3 次。我读对了吗?那里发生了什么?

【问题讨论】:

  • 我无法重现这种行为。检查您的访问日志,并提供有关您正在使用的环境的更多详细信息。很明显,提供的代码不是整个系统,您可能正在另一个地方重置该令牌。
  • 已知某些浏览器插件会导致发送多个请求而不是一个请求的行为。
  • @Josh K 我不是……现在两个页面都是静态的。唯一设置或更改的是令牌,并且只发生在一个地方,如上所示。
  • @James 没有浏览器插件,我网站上的所有其他页面也只收到一个请求。

标签: php session session-variables


【解决方案1】:

完全是我犯的愚蠢错误。我在那里有一些空的&lt;img&gt; 标签导致了额外的请求。 facepalm 对不起大家,问题解决了。谢谢你的帮助!!

【讨论】:

    【解决方案2】:

    您会注意到,每次重新访问第一页时,您的会话变量都会发生变化。由于它适用于常量字符串“example”,因此我假设您重新访问第 1 页以查看其中存储的内容。

    可能会检查以确保在再次设置会话变量之前未设置该会话变量。 即

    <?php
    session_start();
    if(!empty($_SESSION['token'])){
        $token = md5(uniqid(rand(), true));
        $_SESSION['token'] = $token;
    }
    print $_SESSION['token'];
    ?>
    

    这段代码应该可以按预期工作。

    【讨论】:

    • 非常有用的答案。兄弟两个竖起大拇指!
    【解决方案3】:

    我能想到的唯一解决方案是您在不知情的情况下向第一页发出第二个请求。您可能应该检查您的 apache 访问日志以获取第二次访问...

    制作一个简单的请求计数器将是检查此问题的另一种解决方案:

    $_SESSION['counter'] = isset($_SESSION['counter'])? $_SESSION['counter'] +1 : 0;
    

    【讨论】:

    • 是的......这就是问题所在。当我把这段代码放在那里时,我得到了 2。我不知道为什么......这是一个静态页面,除了令牌部分。没有循环,更新内容等......
    • 我在上面发布了我的 Apache Access 日志。
    • 你的意思是每次刷新页面,都是加2而不是加1?您看到 2、4、6 等了吗?你的浏览器有什么特殊的扩展吗?像 firefox 的 HTML 验证器一样?
    • 实际上它上升了 3 (3, 6, 9...) 没有我知道的扩展...普通的旧 Chrome。
    • 在此处查看如何将引用者和用户代理添加到您的访问日志:httpd.apache.org/docs/2.0/logs.html#page-header(可能有用)
    【解决方案4】:

    看起来很奇怪。重置令牌的第一段代码一定已经以某种方式再次运行了。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2013-03-05
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2013-03-21
      • 2018-09-28
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多