你能发现这个PHP错误吗?我很难过

时间:2012-07-29 22:51:36

标签: php

以下是剧本中发生的事情:

  • 会议开始。
  • $id设置为一个数字(锦标赛ID号)。

结果:

  • 使用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();
        }
}
?>

如你所见,绝对没有联合旅行的地方。$ id可以覆盖 - 因为没有使用其他名为$id的变量。 注意:没有全局设置的变量(即全局$id

我不明白为什么会这样,你们能解决这个问题吗?你在这里看到的一切都是它的外观(减去HTML)。

1 个答案:

答案 0 :(得分:3)

转动服务器register_globals中的Off php.ini