奇怪的PHP会话行为

我被一些会话变量的奇怪的行为感到不解。 该“令牌”变量尤其如此。

这是我 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'); ?>

我总是检查“死亡”,而令牌由JavaScript AJAX后的index.php中传递正确的$ _SESSION ['令牌']在ajax_io.php比在index.php文件中创建一个不同。

例如,在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。但只有第一个是一个接我的脚本创建物理,其中由环路产生的其他2。 我把整个循环脚本走了,但没有发现任何设置任何类型的变量的SESSSION。

--------------解决方案-------------

你只是有坏的逻辑。 不要令牌每一次检查。 当你这样做时,它将覆盖它。 只是生成它的需要,而不是每一次。

$_SESSION['token'] = (empty($_SESSION['token'])) ? gen_new_token() : $_SESSION['token'];

您可以储存的时间,对于其至极有效等。

尝试改变.post ,以.ajax同步 ,让我们知道会发生什么。 请张贴脚本的准系统版本,因为你发布的作品是什么确定,问题可能在逻辑别处一个细节。

我无法从脚本剥离了这么多出来张贴代码,逻辑是一样的原职,具有约50-60多行代码中while循环。

我只是发现了更多的寿。 浏览器似乎请求index.php文件不止一次。

127.0.0.1 - - [14月/ 8月/ 2011:19:38:40 +0300]“GET /cmdownloads/index.php?itsme=petsoukos HTTP / 1.1”200 11919 127.0.0.1 - - [14月/ 8月/ 2011: 19点38分40秒+0300]“GET /cmdownloads/js/jquery-1.6.1.min.js HTTP / 1.1”304 - 127.0.0.1 - - [14月/ 8月/ 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月/ 8月/ 2011:19:38:40 +0300]“GET / cmdownloads /css/style.css HTTP / 1.1“304 - 127.0.0.1 - - [14月/ 8月/ 2011:19:38:40 +0300]”GET /cmdownloads/js/script.js HTTP / 1.1“304 - 127.0。 0.1 - - [14 /八月/ 2011:19:38:40 0300]“GET /cmdownloads/img/overlay.png HTTP / 1.1”304 - 127.0.0.1 - - [14 /八月/ 2011:19:38: 40 +0300]“GET /cmdownloads/index.php?itsme=petsoukos HTTP / 1.1”200 11980 127.0.0.1 - - [14月/ 8月/ 2011:19:38:40 +0300]“GET /favicon.ico HTTP / 1.1“404 209

一个正在由用户刷新页面制成,但其他...? 找不到请求的来源。

发现上述双重请求的原因是在foreach循环内呈现的文本IMG标记。 标签有一个空的src参数,被触发的背景的请求。 这一要求被刷新生成的密钥,但因为它是在后台,前端部分没有得到新的密钥。 愚蠢的问题。

在这个问题现在解决了。 (我希望)

分类:php 时间:2012-01-01 人气:0
分享到:

相关文章

  • 如何在asp.net中使用jQuery创建会话 2014-07-30

    如何在asp.net中使用jQuery创建会话? --------------解决方案------------- 一个会话在服务器端发起的. 因此,你需要提出一个要求,基本上做一个webservice的方法或其他服务器生成的页面的任何请求会做的伎俩为您服务. 你可以只发送一个Ajax请求一个Web服务方法(确保已启用会话状态). 除非你的用户已经封锁的Cookie它会工作. 如果他已阻止Cookie,则需要通过他一个aspx或similair在您发起会话采取的路线,并设置会话参数中的URI查询.

  • 如何使用循环在JavaScript中,jQuery的在表中的行数? 2013-12-29

    我有一个表,我想了一些行动,它通过使用JavaScript中循环中执行. 因此,能不能有人告诉我,这将是它的代码. 该循环将为表的所有行工作. 其实我已经从表中删除一个类并在那之后,我有一类适用于特定的行. 什么我的任务就是我必须强调取消高亮选定的行. 当我选择任何行,它的突出,但是当我选择另一排则其依然突出,另一个也. 所以我想从表中的所有行删除选定的类,然后应用选定类特定行. 我的代码是: <style type="text/css"> .highlight { bac

  • 转义的JavaScript中使用jQuery的Rails 2014-01-17

    我在Rails的一个问题逃脱的JavaScript. 使用jQuery,所以escape_javascript()不是一个帮手(我猜?至少它没有工作). 所以,事情是,我在页面上的产品清单. 当你点击一个项目的标题,以项目的详细视图灯箱呈现使用JS响应. 当一些在项目中使用的标题,它在列表中的一切ok. 没有JS运行. 但只要你点击标题,JavaScript是不再逃脱. 出于某种原因,它呈现在show.html.erb没有逃跑. 链接列表(_all_items.html.erb)项弹出: <%=

  • 在Javascript中使用jQuery参数 2012-02-10

    我试图从PHP一个参数传递到我的里面的html javascript函数. 这是在所有可能的? 这是我这么远,但它似乎崩溃,一旦它击中的条件: $str="<input type='submit' value='-' onclick='Call(".$row['field1'].");'/>"; 我希望我不会找一个工作围绕这一点. 谢谢. 编辑:这是我想要调用的函数 function Call(stuff) { alert(stuff); $.get('

  • 在JavaScript中,jQuery的或Django的HTTP基本身份验证? 2013-03-09

    我开发作为"前端"另一个网站(B),这需要一个基本的HTTP验证的Web应用程序(A)(即弹出,并询问用户名和密码的那种). 在我的web应用,每个用户都已经拥有了他对B的用户名和密码存储为自己的账户A.部分然而,用户试图从A B访问资源的第一次,它会提示输入用户名和密码(但不必再为本届会议的其余部分). 我希望它是使用户从来没有明确地进入了国书(因为它们已经存储在他的帐户). 使用Javascript / jQuery的或一些Django的代码,是有可能先发制人验证幕后这个用户,例如

  • 定义函数在Javascript中在jQuery的 2012-01-09

    我工作的一个专有的网站,我有一些问题. 我使用jQuery随着原型,我已经知道了正确的命名空间,所以在这个问题的假设,你可以使用$或JQ作为一个命名空间的引用jQuery的. 所以,我有一堆的功能,有些混合jQuery和JavaScript的,一些普通的JavaScript,只有一些jQuery. 现在,目前某些功能的的document.ready jQuery函数中定义的,有些是它的外部定义,有点像这样: jQ(document.ready(function($) { if ( ifConfi

  • 当在JavaScript中使用“$”/ jQuery的 2014-01-15

    我一直都开始做的JavaScript和jQuery最近一件事我不断地发现自己想知道是什么时候用"$"我知道,指示jQuery的,但它只是并不总是似乎是这样. 我会举一些例子: 这些是我已经写了两个脚本: 第一: $(function() { var newHTML = '<span style="font-size: 1.7em; text-align:center; line-height:50px;">Login</span>'; var

  • JavaScript中,jQuery和HTML标签:如何检查标签关闭 2014-02-24

    我有这个问题很多次:我通过动态jQuery的创建HTML,并在此HTML代码,我想知道是否所有的标签都正确关闭. 如果我尝试看看有什么用Firebug的DOM中,它自动地关闭每个标签,是不是正确地关闭,所以无法在源头看是否所有的标签实际上是正确关闭. 你有一个想法,我怎么可以很容易地找到它是否是动态生成的HTML代码正确关闭? 我用graphist谁始终是修改代码的工作,现在它变得相当复杂(长)排序"手动"的东西. 这是我想检查jQuery脚本示例: $('#tableau >

  • Javascript中,jQuery.extend和“新” 2012-01-03

    我有一个奇怪的行为,同时延长了一个原型使用jQuery.extend的对象. 假设此示例类: var SampleClass = function (anArray) { this.Init(anArray); }; $.extend(SampleClass.prototype, { array: null, collection: new Array(), Init: function (arr) { var c = this; c.array = arr; c.insertInCollect

  • 在Javascript中使用jQuery变量 2012-04-22

    我正在使用AJAX请求调用jQuery选择,所以根据请求返回的值,我选择使用所需的div:EQ()选择,但问题是,我坚持一些东西未定义 这是我希望做 $('.win7red:eq(9)').parent.children('span:eq(1)').children('div:first').css("opacity", "1"); 在这里,在第一EQ选择的值必须为每个请求变量 我在一个javascript变量称为REQ得到的值,然后我用这个,但它会显示错误 $('

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.030 (s). 10 q(s)