我真的很想知道这段代码
<?
session_start()
$_SESSION['me'] = 654;
$me = $_GET['me'];
echo $_SESSION['me'];
?>
它将打印$ me值而不是$ _SESSION ['me']值。
这是一个错误,还是出于安全原因这样做?任何解释?
答案 0 :(得分:5)
您是否有机会启用register_globals?
编辑:这似乎与着名的session side-effect that existed until PHP 4.3有关。如果未初始化会话变量,则将使用可能存在的同名全局变量的值。
PHP版本4.2.3及更低版本具有未记录的功能/错误,允许您在全局范围内初始化会话变量,尽管register_globals已禁用。如果使用此功能,并且还启用了session.bug_compat_warn,PHP 4.3.0及更高版本将发出警告。禁用此指令可以禁用此功能/错误。
我仍然无法完全了解为什么会发生这种情况。 pygorex1在他的回答中所写的内容甚至更奇怪。
答案 1 :(得分:3)
您是否在任何地方致电session_start()
?
如果没有,那么php可能是第二次猜测你的意思,所以你可以检查错误日志,看看究竟发生了什么。
答案 2 :(得分:3)
我可以使用PHP v5.2.10和register_globals
以及多次访问页面后重新创建此行为:
test.php的:
<?php
session_start();
$_SESSION['me'] = 654;
$me = $_GET['me'];
echo $_SESSION['me'];
http://localhost/test.php?me=321
第一次加载页面时,输出为654
。第二次运行页面时,输出变为321
。为什么会这样?
第一次:
$_SESSION['me']
变量不存在,因此未初始化为全局。$_GET['me']
确实存在并初始化为全局变量$me
第二次:
$_SESSION['me']
变量现已存在并初始化为全局变量$me
$me
现在引用$_SESSION['me']
$me
的任何分配都将覆盖会话变量,因此SESSION变量变为321
,输出变为321
然而,OP在评论中表示他已将register_globals关闭......在这种情况下,我不知道该怎么做!