以下是脚本中发生的情况:
- 会话已启动
- CCD_ 1被设置为一个号码(锦标赛ID号码)
结果:
- 用户SESSION变量使用ID号和ID号各自的用户数据重置。本质上是用不同的帐户登录用户
故障排除:
- 将
$id
重命名为$tid
可停止故障 - 不启动会话(
session_start()
)会停止故障
思维过程:
- $id必须覆盖块内的类似变量,该块包含:
if(isset( $_SESSION['someVar'] )) { $id = "some Value"; }
由于$id
仅在会话启动时被覆盖。
问题:
- 没有使用该语法的代码块
这是调用堆栈。
jointourney.php
<?
session_start();
$id = (isset($_POST['id'])) ? $_POST['id'] : false;
include("html.php");
?>
html.php
<?
if(session_id() == '') session_start();
if(!function_exists('isLogged')) include("includes/islogged.inc.php");
include("includes/autologin.inc.php");
$query = mysql_query("SELECT value FROM config WHERE name='shutdown'");
$query = mysql_fetch_array($query);
$shutdown = end($query);
if(!class_exists('ban')) include("class/ban.class.php");
$ban = new ban();
if(isLogged()){
$ban->setUsername($_SESSION['username']);
}
$user_level = (isset($_SESSION['user_level'])) ? $_SESSION['user_level'] : "0";
$ban->setIP($_SERVER['REMOTE_ADDR']);
if((strlen($shutdown) > 0 || $ban->isBanned()) && $user_level == 0 && strtolower($_SERVER['REQUEST_URI']) != "/login.php"){
if(strtolower($_SERVER['REQUEST_URI']) != "/error.php"){
header("Location: ./error.php");
}
}
?>
islogged.inc.php
不需要文件,不设置变量:只返回true/false。
autologin.inc.php自动登录
<?
if(!class_exists('login')) include("./class/login.class.php");
$login = new Login();
if(isset($_COOKIE['username'],$_COOKIE['password']) && !$login->isLoggedIn()){
$login->setUsername($_COOKIE['username']);
$login->setPasswordDirect($_COOKIE['password']);
if(!$login->_error){
$login->processLogin();
}
}
?>
正如你所看到的,绝对没有一个地方可以容纳jointourney$id可以覆盖-因为没有使用其他名为$id
的变量。注:没有全局设置的变量(即全局$id
)
我不明白为什么会发生这种事,你们能弄清楚吗?你在这里看到的一切都是它的样子(不包括HTML)。
在服务器的$id
1中打开register_globals
Off
。