为什么我的基于会话的登录系统不起作用


Why does my session-based login system not work?

我刚刚开始学习PHP,我为我的网站编写了一个使用PHP和mySQL的帐户系统。 我知道sql的东西工作正常,问题是我的PHP会话。

当我去测试它时,我可以尝试登录,但它失败了。 然后,我尝试再次登录,它将成功。 它始终在第二次尝试登录时成功。 它在Firefox中的第一次尝试永远不会成功,但在Chrome中确实成功了。 此外,在Chrome中,在我成功登录后,有几次转到我网站上的一些不同页面似乎会删除会话。 或者,至少,该会话没有在其他页面上注册。 我在火狐上没有这个问题。 我已经检查,仔细检查和三重检查,我的所有页面都先调用session_start(),所以我知道这不可能是问题。

我一定对 PHP 会话没有足够全面的了解,因为它无法始终如一地工作。

发布此内容后,我在IE中进行了测试,那里一切正常。 我在第一次尝试时登录,我访问的任何页面都会保持我的会话。

以下是实际"登录"用户的 php 脚本的代码:

<?php
session_start();
//pass info to mysql(servername, username, password)
$connect = mysql_connect ("localhost", "ggstudio", "mtgertai1");
if (!$connect) 
{
    die ('Failed to connect: ' . mysql_error());
}
mysql_select_db("ggstudio_accountDatabase", $connect);
//capture data sent to page through login
//usernameField and passwordField
$usernameSubmission = $_POST[usernameField];
$passwordSubmission = $_POST[passwordField];
$validAccount = mysql_query("SELECT * FROM userAccounts WHERE userID = '$usernameSubmission' AND userPassword = '$passwordSubmission'");
$row = mysql_fetch_array($validAccount);
if (($row['userID'] == $usernameSubmission)&&($row['userPassword'] == $passwordSubmission))
{
/*********************************
**********************************
assign global variables to session
after starting session and then***
redirect to user homepage*********
**********************************
**********************************
*/
//get account number from database
$_SESSION['accountNumber']= $row['accountNumber'];
//get first name from database
$_SESSION['firstName']= $row['firstName'];
//get last name from database
$_SESSION['lastName']= $row['lastName'];
//save username into session
$_SESSION['username']= $row['userID'];
//save password into session (only really useful if user wants to change password)
$_SESSION['userPassword']= $row['userPassword'];
//get user's email address from database
$_SESSION['userEmail']= $row['userEmail'];
//get GP from database
$_SESSION['gpoints']= $row['userGloryPoints'];
//get user join date from database
$_SESSION['userJoinDate']= $row['userJoinDate'];
//get user rank
$_SESSION['userRank']= $row['userRank'];
header('Location: http://www.glorygamer.com/account_home.php');
}
else
{
    $loginFailed= TRUE;
    setcookie("incorrectLogin", $loginFailed, time()+20);
    header('Location: http://www.glorygamer.com/shibboleth.php');
}
?>

如果会话间歇性地工作,那么我会说发生了以下两种情况之一:

  • 您的会话未在浏览器中正确设置
  • 您的会话未及时保存在服务器上。

可能发生的一件事(特别是当您在本地主机上进行测试时)是经过身份验证的会话没有及时写入磁盘以供下一个请求使用,因此下一个请求似乎是未经身份验证的(请记住,apache 是多进程的;您的第二个请求可能由另一个不知道第一个进程在做什么的进程处理)。 这是一个可能的解决方案:

$_SESSION['userRank']= $row['userRank'];
session_write_close();
header('Location: http://www.glorygamer.com/account_home.php');

调用session_write_close()应意味着经过身份验证的会话已及时准备好迎接下一个请求。

呵。

我看到的第一件事是缺少单引号。 此外,您绝对应该逃避这些,以便没有人可以对您进行任何SQL注入。

$usernameSubmission = $_POST[usernameField];
$passwordSubmission = $_POST[passwordField];

应该是:

$usernameSubmission = mysql_real_escape_string($_POST['usernameField']);
$passwordSubmission = mysql_real_escape_string($_POST['passwordField']);