当 register_globals 关闭时 PHP5 $_SESSION 不工作

Posted

技术标签:

【中文标题】当 register_globals 关闭时 PHP5 $_SESSION 不工作【英文标题】:PHP5 $_SESSION not working while register_globals is off 【发布时间】:2011-12-12 05:59:02 【问题描述】:

我知道,这个问题问了很多次,但我找不到解决办法。 我编写了一个 php/JS 脚本来从服务器获取数据并显示它们。我正在使用 Ajax 来验证用户是否经过身份验证?我正在使用以下方法来做到这一点; 我的 index.php:

>?php ... ... $.post("data.php", req:'登录', username:$('#username').val(), //用户输入给定的id pass:$('#password').val(), 工作:$('#job').val(), rand:Math.random() , 功能(数据) if (data == 'yes') // 用户已通过身份验证。 document.location='system.php'; ... ... // 我正在使用表单将收集到的数据发送到 data.php ?>

data.php中的代码是这样的:

>?php session_start(); $link = mysql_connect("localhost", "user", "pass"); 如果(!$链接) die("没有连接:" .mysql_error()); mysql_select_db("数据库"); if ($_POST["req"] == "login") $user_id=($_POST["用户名"]); $user_pass=($_POST["pass"]); $user_job=($_POST["job"]); // 选择合适的表(与他/她的工作相关)并控制用户是否提供了正确的密码? if(密码正确) $_SESSION["id"]=$_POST["username"]; // 或 $_SESSION["id"]=$user_id; 回声“是”; 否则回显“否”; //登录无效 else if ($_POST["req"] == "userinfo") ... ... ... 别的 ... ... ?>

系统在此处运行良好,我正在重定向到 system.php,在 system.php 中我想使用 $_SESSION 变量在 javascript 中获取登录的用户名。 我的system.php的一部分;

>?php session_start(); if ((isset($_SESSION["id"]))||(!empty($_SESSION["id"]))) header("Location:index.php"); $userno = $_SESSION["id"]; if(isset($_GET["注销"])) session_destroy(); $_SESSION["id"] = 假; header("位置:index.php"); ?> ... ... ... >脚本类型=“文本/javascript”> $.post("data.php", req:'userinfo',username:'>?php echo ($userno) ?>',rand:Math.random() ,function(data) // 确定 ?php 在脚本中是正确编写的 ;) //.. 再次从 data.php 获取数据并将结果放入页面.. ); >>脚本>

此代码在我的 PC (xampp) 中正常工作,但在我的服务器上没有机会..echo ($userno) 不输出任何内容。 我搜索了很多地方,发现这是因为 register_globals 已关闭。我明白为什么会这样。 但是为什么我无法在我的 system.php 中获取 $_SESSION["id"] 的值并将其分配给 $userno注意:我我对许多其他请求使用相同的 data.php 文件,所有这些请求都取决于用户名,但不同的条件会更改用于数据源的表,因此我一开始无法获取信息。 现在谢谢... 注意:由于我找不到使用代码突出显示的正确方法,我将 >?php 用于启动 php 代码部分和 >script 用于 JS 代码部分..

【问题讨论】:

@Frank Farmer:我都试过了,没有改变/没有机会:( 在脚本顶部添加error_reporting(E_ALL); @ mario :我做了但没有显示,我使用 HTTPFox 来定义问题,我看到,$userno 部分在页面中没有输出任何内容。所以 req:'userinfo',username:'' 看起来像 req:'userinfo',username:'' 我不确定你的问题是什么,但是 PHP 中的变量名是区分大小写的,所以绝对可以肯定它不适用于 $_session。你可能想改变它,只是为了确保你在那里是正确的。 @Alper:你不能。你当然不能自己调整服务器 php.ini。没关系。 -- 但请发布您的 real 当前代码。显示您添加 error_reporting() 的位置。 -- 还要比较浏览器中的 SID cookie 值。它会随着页面的变化而变化吗? 【参考方案1】:

我认为应该是$_SESSION,而不是$_session。它是一个超全局变量,并且区分大小写。

【讨论】:

【参考方案2】:
echo '<pre>';
print_r($_SESSION);
die;

你得到了什么?

在服务器端检查$userno的内容:

$userno = $_session["id"];
var_dump($userno);
die;

【讨论】:

$userno = $_session["id"]; var_dump($userno);死;返回NULL 那么你的会话变量有问题。如前所述,将会话变量更改为大写并尝试再次转储其内容。 我已更改为 $_SESSION["id"] ant 尝试转储,结果:NULL 您是否检查过会话是否有效?您确定您实际上是通过 AJAX 调用获得输入的吗?要找到问题的根源,最简单的方法就是沿着车道滚动,从输入开始,到输出结束。尝试转储每个重要变量,并确保在到达设置会话的位置之前正确设置它们。 感谢您的帮助和努力,但关于 BOM 编码的问题(我的错误)并已解决。再次感谢您。【参考方案3】:

这很有趣,我已经在我的服务器上控制了 error.log 文件(我不知道为什么我之前没有控制)有一些错误说:会话已经发送...类似错误 我找到了一个论坛页面,上面写着: 有时问题是由 Include Unicode Signature (BOM) 属性引起的,然后我控制了我的编码类型,我看到它是 Unicode with BOM(我使用的是没有 BOM 但我不明白它是怎么发生的),当我转换 without bom 问题就解决了。

这完全是我的错误(甚至是错误信息)感谢您的所有帮助。

【讨论】:

【参考方案4】:

注册变量的简单解决方案。

foreach ($_POST as $key => $value) 
 eval("$".$key."= '".$value."';");

【讨论】:

以上是关于当 register_globals 关闭时 PHP5 $_SESSION 不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何防止SQL注入漏洞

使用 PHP 5.5 将 register_globals 添加到 XAMPP 1.8.4

当php版本小于5.30点7+register+gl+o+bas=on时会存在哪种漏洞?

如何在 Android 应用中处理购物车和付款? [关闭]

使 UISwitch 在打开/关闭时隐藏/取消隐藏标签

我正在使用 PH 照片库来获取所有照片和视频