我对一些会话变量的奇怪行为感到困惑。特别是“令牌”变量。
这就是我在 index.php :
中创建它的方法<?php
session_start();
$_SESSION['token'] = sha1(rand(7451, 98632)); // Lets name it "something"
?>
然后我用AJAX进行POST并将该变量传递给另一个脚本, ajax_io.php :
在 ajax_io.php :
内<?php
session_start();
if($_POST['token'] != $_SESSION['token']) die('Horribly');
?>
我的检查总是“死”,而令牌通过index.php中的javascript AJAX帖子正确传递,ajax_io.php中的$ _SESSION ['token']与index.php中创建的不同
e.g。在ajax_io.php中:
The $_POST['token'] appears as "something"
but,
$_SESSION['token'] appears as "something else"
如果AJAX帖子请求index.php(不知何故)创建另一个令牌,然后请求ajax_io.php执行所请求的功能。
以下是Javascript AJAX请求:
var token = '<?php echo $the_token; ?>';
$.post("ajax_io.php", {
token: token
}, function(data) {
// Do something with data
});
更新:
我没有在真实脚本中提到过,有一个foreach循环,并且该循环是导致问题的原因。它以某种方式用每个循环上新生成的一个重写php令牌变量,但脚本保留了设置javascript变量的原始值。
$the_token = sha1(mt_rand(10, 100));
$_SESSION['tokens'][] = $the_token; // Notice the multidimensional array here
foreach(somethin) :
// do something other than setting any session variable
endforeach;
print_r( $_SESSION );
输出:
Array (
[tokens] => array (
[0] => b19477cb038d6e0f588b6631c1686c8e246b82d5 // The real one created at the beginning of the script
[1] => 51e57c94bfd5c81b11e8c48dc8002b1162f4cd84
[2] => 084c881c074678218a4394524f60d3867da84cb3
)
)
在这个脚本上,如果我回显$ _SESSION,我会获得N个令牌,例如3.但是只有第一个是由我的脚本物理创建的,另外两个是由循环创建的。我已经完成了整个循环脚本,但没有找到任何设置任何类型的变量给SESSSION。
答案 0 :(得分:0)
你的逻辑错误。不要每次检查令牌。当你这样做时,它会覆盖它。只需根据需要生成它,而不是每次都生成它。
$_SESSION['token'] = (empty($_SESSION['token'])) ? gen_new_token() : $_SESSION['token'];
你可以存储时间,因为它有效等等。
答案 1 :(得分:0)
尝试将.post
更改为.ajax
同步,并告诉我们发生了什么。请发布该脚本的准系统版本,因为您发布的内容正常,问题可能是其他地方逻辑中的细节。
答案 2 :(得分:0)
我不能从剧本中删除这么多内容来发布代码,逻辑与原始帖子相同,WHILE循环有大约50-60行代码。
我刚发现了更多。浏览器似乎不止一次请求index.php文件。
127.0.0.1 - - [14 / Aug / 2011:19:38:40 +0300]“GET /cmdownloads/index.php?itsme=petsoukos HTTP / 1.1”200 11919 127.0.0.1 - - [14 / Aug / 2011:19:38:40 +0300]“GET /cmdownloads/js/jquery-1.6.1.min.js HTTP / 1.1”304 - 127.0.0.1 - - [14 / Aug / 2011:19:38:40 +0300]“GET /cmdownloads/js/jquery-ui-1.8.13.custom.min.js HTTP / 1.1”304 - 127.0.0.1 - - [14 / Aug / 2011:19:38:40 +0300]“GET /cmdownloads/css/style.css HTTP / 1.1”304 - 127.0.0.1 - - [14 / Aug / 2011:19:38:40 +0300]“GET /cmdownloads/js/script.js HTTP / 1.1”304 - 127.0.0.1 - - [14 / Aug / 2011:19:38:40 +0300]“GET /cmdownloads/img/overlay.png HTTP / 1.1”304 - 127.0.0.1 - - [14 / Aug / 2011:19:38:40 +0300]“GET /cmdownloads/index.php?itsme=petsoukos HTTP / 1.1”200 11980 127.0.0.1 - - [14 / Aug / 2011:19:38:40 +0300]“GET /favicon.ico HTTP / 1.1”404 209
一个是由用户刷新页面,但另一个......?找不到该请求的来源。
答案 3 :(得分:0)
发现双重请求的原因是foreach循环内的渲染文本上的IMG标记。标签有一个空的src参数,它在后台触发请求。该请求刷新了生成的密钥,但由于它是在后台,前端部分没有获得新密钥。愚蠢的问题。
这个问题现在解决了。 (我希望)