1

我有一个 cms 的登录和会话创建脚本。它会检查管理文件以获取正确的详细信息,否则会执行 SQL 查询以获取用户详细信息。根据哪个成功然后加载相应的页面来设置会话变量。

该脚本适用于 PHP 5.2,但我一直在尝试重写代码以修复 PHP 5.4 的弃用函数,register_globals特别$http_session_vars是。我想我遇到的问题是变量($s_Vers)没有被正确设置,因为它使用了一个数组。

到处走走register_globals

$aPwd = $_REQUEST['aPwd'];
$aLogin = $_REQUEST['aLogin'];
$lname = $_REQUEST['lname'];
$pswd = $_REQUEST['pswd'];

这似乎工作正常。

因为$HTTP_SESSION_VARS我已将所有实例替换为$_SESSION. 我会假设这不是那么简单。if$s_vers为管理员设置的语句的摘录。

if ( $lname === $aLogin
  && (( $aPwd && md5($pswd) === $aPswd )
  || (!$aPswd && $name === $pswd )) )
{ 
$s_Vers  = $_SESSION["s_Vers"] = 0;
$s_aid   = $_SESSION["s_uid"] = 0;
}

在此之后,有一个 else 语句来运行 SQL 查询以获取用户登录详细信息。

然后是这个:

else $wrong = true;
}

if( isset($_SESSION["s_Vers"]) && !@$wrong )
{
  include "setup.php";
    if( $s_Vers == 0 )
        header("Location: adminpage.php");
    else
        header("Location: userpage.php");
    exit();
}

上面有什么明显错误的地方吗?

会话变量存储在会话数组中,如下所示:

session_start();
$session_array = array("username", "password", "s_uid", "s_Vers");

所以当我输入管理员详细信息时会发生什么,我看到它直接到 adminpage.php,因为它应该让我退出。我猜是因为这个:

if ( (!IsSet($curmode) && !$username) || isset($logout)
        || $s_Vers != $_SESSION["s_Vers"] 
        || $s_uid != $_SESSION_["s_uid"]
     )
{
    $username = "";
    $password = "";
    $curmode = 0;
    session_destroy();
//  echo "Here";
//  exit();
//  Header("Location: http://".$g_AfterLogoutURL);
?>
<HTML>
    <HEAD>
        <TITLE>Not Authorised</TITLE>
        <meta http-equiv="refresh" content="1;url=login.php">
    </HEAD>

<SCRIPT language="javascript">
    parent.location="login.php";
</SCRIPT>

    <BODY>
    </BODY>
</HTML>
<?
    exit();
}

s_Vers在所需文件中的两个函数中被设置为全局,但在加载管理页面之前不会执行。

脚本的其他部分包含要求和变量声明,但与会话或登录顺序无关。

任何人都知道我要去哪里错了,或者可以提供解决方案吗?

4

1 回答 1

0

检查$_SESSION["s_Vers"]使用var_dump();,bec。为了

$s_Vers  = $_SESSION["s_Vers"] = 0;

变量应该是同一类型,否则=不会发生运算符。

在你的情况下,它应该是(int),bec。最后一项(即 0)是(int)类型。

于 2012-12-29T08:04:04.193 回答