我正在为我所在的机器人团队编写 PHP 登录系统。登录系统的流程如下。
- 在索引页面上,它检查 $_SESSION['log_info'] 是否设置为 'true',如果是,则显示成员的内容。如果它是假的,它会显示一个登录页面。
- 然后,登录后,它转到连接到数据库的 login.php 并检查用户凭据是否匹配等。它将 $_SESSION['log_info'] 存储到与 login.php 页面上的事件相对应的一系列值。
- 然后它重定向到读取 $_SESSION['log_info'] 的索引页面(因此知道 login.php 页面的状态)并对不同的值执行操作。
我的问题是会话变量没有通过 login.php 页面上的重定向传递。它们是空的。
我检查过并且有效的事情:
- 我已经检查过它们是否正在设置,并且它们是。(我可以在 login.php 页面上回显它们。)
- 我也知道重定向有效,因为我可以更改标题语句的位置,并且一切正常。
- 我也知道 PHP 会话 cookie 在整个过程中保持不变,所以也不是这样。
- 我有 session_start(); 在我所有的页面上。
这是两个页面的代码:
索引.php
<?php // this is first line of page
session_start();
// If user is not logged in, sets $log_info == 'false'
if (!isset($_SESSION['log_info']) || $_SESSION['log_info'] == '' || $_SESSION['log_info'] == '0') { $_SESSION['log_info'] = 'false'; }
function get_banner() {
// Switch statement for all cases of $log_info... Usually displays banner to user...
switch ($_SESSION['log_info']) {
case 'true':
echo '<div class="banner">You are logged in!</div>';
$_SESSION['log_info'] = '';
break;
case 'false':
echo '<div class="banner">Please login below.</div>';
$_SESSION['log_info'] = '';
break;
case 'error':
echo '<div class="banner">Your username or password do not match.</div>';
$_SESSION['log_info'] = '';
break;
case 'acc_fail_username':
echo '<div class="banner"><b>Account creation failed:</b><br/>Your selected username already exists. Please pick a different one.</div>';
$_SESSION['log_info'] = '';
break;
case 'acc_fail_parm':
echo '<div class="banner"><b>Account creation failed:</b><br/>One or more of your entry fields were invalid. Please try again.</div>';
$_SESSION['log_info'] = '';
break;
case 'acc_success':
echo '<div class="banner">Your account was successfully created! Login below.</div>';
$_SESSION['log_info'] = '';
break;
default:
$_SESSION['log_info'] = '';
//die('Something went wrong internally. Please stay calm while we fix it');
}
}
?>
<?php get_banner(); ?>
<b>Login:</b>
<form action="login.php" method="post">
Username: <input type="text" name="username"><br/>
Password: <input type="password" name="password"><br/>
<input type="submit">
</form>
登录.php
<?php // this is first line of page
session_start();
// Connect and verify connection
$con = @mysqli_connect($host, $username, $password, $dbname);
$username = $_POST['username'];
$password = $_POST['password'];
$query = mysqli_query($con, "SELECT * FROM FRC4096users WHERE username='".$username."'");
$row = mysqli_fetch_array($query);
$salt = $row['salt'];
if ($row['passwordhash'] === hash('sha512', $password . $salt)) {
$salt = hash('sha512', rand());
mysqli_query($con, "UPDATE users SET salt='". $salt ."' WHERE username='".$username."'"); // Resets salt on login for security
mysqli_query($con, "UPDATE users SET passwordhash='". hash('sha512', $password . $salt) ."' WHERE username='".$username."'"); // Resets salt on login for security
$_SESSION['log_info'] = 'true';
session_write_close();
header('Location: /');
die();
} else {
$_SESSION['log_info'] = 'error';
session_write_close();
header('Location: /');
die();
}
?>