私が所属しているロボット工学チームの PHP ログイン システムを作成しています。ログインシステムの流れは以下の通りです。
- インデックス ページで、$_SESSION['log_info'] が「true」に設定されているかどうかを確認し、設定されている場合はメンバーのコンテンツを表示します。false の場合、ログイン ページが表示されます。
- 次に、ログイン後、データベースに接続し、ユーザーの資格情報が一致するかどうかなどを確認する login.php に移動します。$_SESSION['log_info'] を login.php ページのイベントに対応する値の範囲に保存します。
- 次に、$_SESSION['log_info'] を読み取るインデックス ページにリダイレクトし (したがって、login.php ページのステータスを認識します)、さまざまな値に対してアクションを実行します。
私の問題は、セッション変数が login.php ページのリダイレクトを通過していないことです。それらはヌルです。
私がチェックしたこととそれが機能していること:
- それらが設定されていることを確認しましたが、設定されています。(login.php ページでエコーできます。)
- また、ヘッダーステートメントの移動先を変更でき、すべて正常に機能するため、リダイレクトが機能することも知っています。
- また、PHP セッション Cookie は試練の間ずっと一定のままであることも知っているので、そうではありません。
- 私は sessions_start(); を持っています。すべての私のページで。
2 つのページのコードは次のとおりです。
index.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>
login.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();
}
?>