После ввода «защищенной» страницы у меня есть оператор if, спрашивающий, вошел ли пользователь в систему, как показано ниже.PHP Session уничтожает дважды?
Это утверждение меня озадачивает, так как результат обоих утверждений один и тот же, но это единственный способ завершить сессию при обновлении страницы. Поэтому, если я изменил оператор на if (!session == user) {session_destroy} else { continue with session}
, обновление страницы будет проходить сессия.
редактироватьif/else
заявление в session.php
это один я не понимаю. Как я могу получить заявление if/else
с двумя равными результатами и все же получить на практике два разных результата. Когда я ввожу свои учетные данные, введите session.php
. Если я обновляюсь, я возвращаюсь в index.php
. Однако в моем заявлении утверждается, что если у меня есть переменные сеанса, то уничтожьте сеанс. Если у меня нет переменных сеанса, уничтожьте сеанс. Что я не замечаю?
Безопасная страница session.php
страница.
<?php
// To connection
require("includes/functions.php");
// Is the user logged in?
if(!isset($_SESSION['user'])) {
//If user not set, destroy session.
session_destroy();
header("Location: index.php");
exit();
} else {
//Here is the funky part, why have if condition with two predicted equal statements, but have two different outcomes.
// If set, destroy session.
session_destroy();
} //Then the anything below should be secure.
?>
Мой (включенный один файл) functions.php
фактически соединяться с БД с session_start()
. Страница login_process.php
выглядит следующим образом.
<?php // Connection require_once("functions.php"); //Once form has been clicked, the submitted name reappears, but first empty. $submitted_username = ''; // IS form submitted? if(!empty($_POST['login'])) { // Find username $query = " SELECT id, username, password, salt, email FROM users WHERE username = :username "; // The parameter values $query_params = array( ':username' => $_POST['username'] ); try { // Execute the query against the database $stmt = $db->prepare($query); $result = $stmt->execute($query_params); } catch(PDOException $ex) { die("Failed to run query: " . $ex->getMessage()); } // Login bad first $login_ok = false; // Find user $row = $stmt->fetch(); if($row) { // Check password $check_password = hash('sha256', $_POST['password'] . $row['salt']); for($round = 0; $round < 65536; $round++) { $check_password = hash('sha256', $check_password . $row['salt']); } if($check_password === $row['password']) { // If match, login good. $login_ok = true; } } // If allgood session start. if($login_ok) { unset($row['salt']); unset($row['password']); //Issue here? $_SESSION['user'] = $row; // Redirect user to secret page. header("Location: session.php"); exit; } else { // Tell the user they failed $login_failed = "<p class='clear floatleft'>Login Failed.</p>"; $submitted_username = htmlentities($_POST['username'], ENT_QUOTES, 'UTF-8'); } } ?>
require_once
в login_process.php
происходит из-за login_form.php
добавляется как включить на каждой странице. Таким образом, всегда создается session_start();
. См. Ниже login_form
.
<?php include('login_process.php'); ?>
<form action="" method="post">
<!-- Sign in form -->
<label>Username</label>
<input type="text" name="username" value="<?php echo $submitted_username; ?>">
<label>Password</label>
<input type="password" name="password" value="">
<input class="inline" type="submit" name="login" value="Login">
<input class="inline" type="submit" name="signup" value="Sign Up">
</form>
<?php if(isset($login_failed)) {
echo $login_failed;
}
?>
Форма забирается из учебника, пожалуйста, поймите, что я не как еще способна производить такой вид Логин рендеринга. Мне нравится думать, что я понимаю блоки кода комментариями, которые я создал.
Но я перевариваю, я не понимаю, как оператор if/else
в session.php
может иметь два равных значения и визуализировать по-разному. Поэтому всякая помощь по этому вопросу была бы весьма признательна.
Этот вопрос может быть дубликатом, я прочитал так много вопросов относительно сеансов, что чувствую себя слепым, чтобы найти какую-либо помощь.
Заранее спасибо.
Я не вижу вашу страницу, содержащую 'session_start()' в любом месте. Вы должны положить это на КАЖДОЙ странице, где вы используете сеансы. Вы также должны очистить свои значения '$ _POST' от символов HTML. – Eda190
'session_start()' входит в 'functions.php', который включен в каждую страницу. Да, санитарию я тоже буду думать. – StudentEric
Я перечитываю ваш вопрос, и я не могу найти то, о чем вас точно спрашивают. Измените свой вопрос, чтобы люди поняли вашу проблему. – Eda190