PHP Session破坏两次?

时间:2015-04-11 09:55:57

标签: php forms session

进入“安全”页面后,我有一个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语句如何具有两个相等的值并以不同的方式呈现。因此,非常感谢对这一特定主题的任何帮助。

这个问题可能是重复的,我已经阅读了很多关于会议的问题,我觉得找不到任何帮助。

提前致谢。

1 个答案:

答案 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 声明。