Как я могу не позволить пользователю вернуться после выхода из системы в PHP? - PullRequest
7 голосов
/ 24 июня 2009

Я только что написал сценарий входа в PHP, и я пытаюсь добиться того, чтобы, когда пользователь нажимает на ссылку выхода из системы, после того как он выходит из системы, независимо от нажатия кнопки «Назад» в браузере, он не может получить доступ к странице. ,

Вот функция выхода из системы:

//Start the Session
session_start();
session_destroy();

header("location:login.php");
exit();

Я разместил следующий код на всех страницах, и это, похоже, не сработало:

header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1
header ("Pragma: no-cache");

//Start the Session
session_start();

Есть предложения?

Ответы [ 8 ]

8 голосов
/ 24 июня 2009

Вы не можете контролировать работу кнопки возврата на стороне клиента на сервере. Вы можете уничтожить данные истории, используя JavaScript на клиенте.

Клиент может полностью игнорировать заголовки без кэширования.

2 голосов
/ 24 июня 2009

Я думаю, вам нужно что-то сохранить в сессии, а затем проверять это при каждой загрузке страницы. Вот как я это делал в прошлом

Скрипт входа в систему (упрощенный)

session_start()
// register necessary session variables
$_SESSION['username'] = $username;

Сценарий выхода из системы:

session_start();

// destroy the session and check to make sure it has been destroyed
session_destroy();
    if(!session_is_registered('username')){
        $loginMessage = 'You have been logged out.';
        include 'index.php';
        exit();
    }

// if we're still here, some bad juju happened

Верх каждой страницы

session_start()

// make sure user is logged in
if (!$_SESSION['username']) {
    $loginError = "You are not logged in.";
    include("index.php");
    exit();
}

2 голосов
/ 24 июня 2009

Проверьте, когда пользователь вышел из системы, если для глобального сеанса все еще задано правильное значение.

print_r($_SESSION);

Причина этого заключается в том, что вы выполняете сеанс session_destroy, а затем перенаправляет заголовок. В результате происходит принудительное перенаправление, и уничтожение сеанса не записывается на сервер таким образом.

2 голосов
/ 24 июня 2009

Просто перенаправьте, если нет логина $ _SESSION, например:

//on your protected pages
session_start();
if(!$_SESSION['logged']) {
    header("location:login.php");
}

Вот что делает мой выход:

session_start();
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}
// Finally, destroy the session.
session_destroy();
0 голосов
/ 28 августа 2014
<?
session_start();
if (!isset($_SESSION['username']) && !isset($_SESSION['password'])) {
    header('Location:../index.php');
    exit;
} else {
    session_destroy();
}
?>

это действительно помогает мне ... вставить это на каждую страницу или на страницу, где ваш выход из системы

<?php
session_start();
session_unset();
session_destroy();
header("Location:../index.php");
exit;

и так просто, как это уничтожить вашу сессию

0 голосов
/ 24 июня 2009
$_SESSION['blah'] = '';

Это тоже работает ..

0 голосов
/ 24 июня 2009

Это могут быть ваши session_destroy () функции. Попробуйте это:

unset($_SESSION);

Отмена установки переменной $ _ SESSION очистит все, что хранится здесь.

Извлечение unset () на PHP.net

0 голосов
/ 24 июня 2009

Я бы посоветовал вам использовать HTTPS с SSL. Вы можете закрыть сеанс SSL и отправить пользователя обратно на незашифрованную страницу.

Большинство браузеров по-разному реализуют схемы кэширования.

Например, в Opera вы можете нажать кнопку Назад, и она будет извлекать данные страницы непосредственно из памяти без отправки каких-либо данных на сервер, даже если срок действия страницы истек. Конечно, если вы нажмете «Обновить», вашему серверу потребуется логин.

В Internet Explorer он обрабатывается совсем по-другому, и данные формы повторно отправляются на сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...