我有一个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
的{{1}}语句摘录。
$s_vers
在此之后,有一个else语句来运行用户登录详细信息的SQL查询。
然后有这个:
if ( $lname === $aLogin
&& (( $aPwd && md5($pswd) === $aPswd )
|| (!$aPswd && $name === $pswd )) )
{
$s_Vers = $_SESSION["s_Vers"] = 0;
$s_aid = $_SESSION["s_uid"] = 0;
}
上面有什么明显的错误吗?
会话变量存储在会话数组中,如下所示:
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();
}
因此,当我输入管理员详细信息时会发生什么,我直接看到adminpage.php,因为它应该将其记录下来。我猜是因为这个:
session_start();
$session_array = array("username", "password", "s_uid", "s_Vers");
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();
}
被设置为必需文件中的两个函数的全局,但在加载管理页面之前不会执行。
脚本的其他部分包含需求和变量声明,但与会话或登录顺序无关。
任何人都知道我哪里出错,或者能提供解决方案吗?
答案 0 :(得分:0)
使用$_SESSION["s_Vers"]
检查var_dump();
,即可。对
$s_Vers = $_SESSION["s_Vers"] = 0;
变量应为一个且类型相同,否则=
运算符将不会发生。
在你的情况下它应该是(int),bec。最后一项(为0 )属于(int)类型。