2010-09-18 86 views
5

我有我这样设置会话变量:PHP会话变量的变化

<?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我以为是“/”)正在叫三次。我读的是对的吗?那里发生了什么?

+0

我无法重现此行为。检查您的访问日志,并提供有关您正在使用的环境的更多详细信息。很明显,提供的代码不是整个系统,您可能在其他地方重置了该令牌。 – 2010-09-18 21:59:00

+0

某些浏览器插件已知会导致发送多个请求而不是一个请求的行为。 – James 2010-09-18 22:28:48

+0

@Josh K我不是......两个页面现在都是静态的。唯一被设置或更改的是令牌,并且只发生在一个地方,如上所示。 – williamg 2010-09-18 22:31:09

回答

3

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

1

看起来很奇怪。重置令牌的第一部分代码必须以某种方式再次运行。

2

我能想到的唯一解决方案是您在不知道它的情况下向第一页发出第二个请求。你或许应该检查你的Apache访问日志本次访问...

制作一个简单的请求计数器将是另一个解决方案进行检查:

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

是的......这就是问题所在。当我把这个代码放在那里,我得到2.我不明白为什么,但...这是一个静态页面,除了令牌部分。没有循环,更新内容等... – williamg 2010-09-18 22:08:37

+0

我上面发布了我的Apache Access日志。 – williamg 2010-09-18 22:20:35

+0

你的意思是每次刷新页面时,都会添加2而不是1?你看到2,4,6等?你的浏览器中有没有特别的扩展名?就像Firefox的HTML验证器一样? – greg0ire 2010-09-18 22:25:58

2

你会发现,每次重温第一页,你的会话变量将会改变。由于它适用于常量字符串'example',因此我会假设您重新访问第1页以查看存储在那里的内容。

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

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

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

+0

不,同样的问题,但谢谢你的尝试! – williamg 2010-09-18 22:08:56

+0

非常有用的答案。两个竖起大拇指! – 2014-01-15 10:35:56