2015-04-11 4 views
0

После ввода «защищенной» страницы у меня есть оператор 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 может иметь два равных значения и визуализировать по-разному. Поэтому всякая помощь по этому вопросу была бы весьма признательна.

Этот вопрос может быть дубликатом, я прочитал так много вопросов относительно сеансов, что чувствую себя слепым, чтобы найти какую-либо помощь.

Заранее спасибо.

+1

Я не вижу вашу страницу, содержащую 'session_start()' в любом месте. Вы должны положить это на КАЖДОЙ странице, где вы используете сеансы. Вы также должны очистить свои значения '$ _POST' от символов HTML. – Eda190

+0

'session_start()' входит в 'functions.php', который включен в каждую страницу. Да, санитарию я тоже буду думать. – StudentEric

+0

Я перечитываю ваш вопрос, и я не могу найти то, о чем вас точно спрашивают. Измените свой вопрос, чтобы люди поняли вашу проблему. – Eda190

ответ

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 [ «пользователя»]

if(!isset($_SESSION['user'])) { 

    //If user not set, destroy session. 
    session_destroy(); 
    header("Location: index.php"); 
    exit(); 

затем уничтожить сессию.

ДРУГИЕ РАЗГРУЗКИ.

Так что независимо от того, что пользовательская сессия была уничтожена. Успешно или нет.

Причина, по которой вы не перенаправляетесь до обновления, потому что после входа в систему - успешно, ваша сессия будет уничтожена. Тогда на обновления (той же странице) вы удовлетворяете чек на

if(!isset($_SESSION['user'])) { 

    //If user not set, destroy session. 
    session_destroy(); 
    header("Location: index.php"); 
    exit(); 

, потому что $ _SESSION [ «пользователь»] больше не существует. Таким образом, он перенаправляет вас на домашнюю страницу.

TL; DR session_destroy() очистили $ _SESSION [ 'пользователя'] и обновления на той же странице вызывает пользователя, чтобы очистить первую проверку если заявление.

+0

Да, условия непрофессионала - вот что нужно. Вот как я понимаю (исправьте меня, если я ошибаюсь) «если сеанс ['пользователь'] не установлен, не уничтожен и не перенаправлен», а «если сеанс [« пользователь »] установлен просто уничтожить, но оставайтесь на странице, пока не обновится». Спасибо Quentin, я удалил инструкцию else и попытаюсь установить лимит времени сеанса вместо этого, а затем просто выйдите из страницы выхода. – StudentEric