进入“安全”页面后,我有一个if语句,询问用户是否已登录,如下所示。
这句话令我感到困惑,因为两个陈述的结果是相同的,但这是我刷新页面时结束会话的唯一方法。因此,如果我将语句更改为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
语句如何具有两个相等的值并以不同的方式呈现。因此,非常感谢对这一特定主题的任何帮助。
这个问题可能是重复的,我已经阅读了很多关于会议的问题,我觉得找不到任何帮助。
提前致谢。
答案 0 :(得分:1)
Digress
您的代码正在完成它的编写工作。就像你认为的那样。
当用户输入他们的凭据并在 login_process.php 中成功 -
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
{
用户被重定向到session.php以破坏其会话。为什么?因为代码说如果用户在 $ _ SESSION中没有任何内容[&#39;用户&#39;]
if(!isset($_SESSION['user'])) {
//If user not set, destroy session.
session_destroy();
header("Location: index.php");
exit();
然后销毁会话。
OTHERWISE销毁会话。
所以无论用户会话被破坏了什么。成功与否。
您没有被重定向直到刷新的原因是因为您登录后 - 成功 - 您的会话被销毁。然后在刷新(同一页面)时,您满足检查
if(!isset($_SESSION['user'])) {
//If user not set, destroy session.
session_destroy();
header("Location: index.php");
exit();
因为$ _SESSION [&#39;用户&#39;]不再存在。因此,它会将您重定向到主页。
TL; DR session_destroy()已清除 $ _ SESSION [&#39;用户&#39;] 并且同一页面上的刷新会导致用户清除首次检查 if 声明。