Запретить кнопку "Назад" после выхода из системы

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

Я могу избежать этого, не позволяя браузеру кэшировать

header("Cache-Control", "no-cache, no-store, must-revalidate")

Но таким образом я теряю преимущество кэширования браузера.

Пожалуйста, предложите лучший способ добиться этого. Я чувствую, должен быть способ обработки этого с помощью клиентской стороны javascript

Ответ 1

Реализуйте это в PHP, а не в javascript.

В верхней части каждой страницы проверьте, вошел ли пользователь в систему. Если нет, они должны быть перенаправлены на страницу входа:

<?php 
      if(!isset($_SESSION['logged_in'])) : 
      header("Location: login.php");  
?>

Как вы упомянули, при выходе из системы просто отключите переменную сеанса logged_in и уничтожьте сеанс:

<?php
      unset($_SESSION['logged_in']);  
      session_destroy();  
?>

Если пользователь нажимает кнопку "назад", переменная сеанса logged_in не будет доступна, и страница не будет загружена.

Ответ 2

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

При проверке входа в систему script, если пользователь аутентифицирован, установите одно значение сеанса, например, следующим образом:

$_SESSION['status']="Active";

И затем в профиле пользователя script введите следующий фрагмент кода:

<?php

session_start();

if($_SESSION['status']!="Active")
{
    header("location:login.php");
}

?>

Что делает код выше, только и только если $_SESSION['status'] установлен на "Active", тогда он будет только в профиле пользователя, и этот ключ сеанса будет установлен на "Active", только если пользователь будет аутентифицирован... [Обратите внимание на отрицание [! '] в фрагменте кода]

Вероятно, код выхода должен быть следующим:

{
    session_start();
    session_destroy();
    $_SESSION = array();
    header("location:login.php");
}

Надеюсь, это поможет...!!!

Ответ 3

Я думаю, что ваш единственный вариант на стороне сервера - это запретить кеширование. Это на самом деле не так уж плохо, если вы используете тяжелое приложение Javascript, поскольку ваш основной HTML может быть только серией JS-вызовов, а Views затем генерируются "на лету". Таким образом, основная часть данных (JS MVC и основной код) кэшируется, но фактический запрос страницы не является.

Чтобы добавить к комментариям, вставленным ниже, я бы предложил добавить небольшой вызов AJAX во время загрузки, который срабатывает даже для кэшированных страниц, которые идут на ваш сервер и проверяет сеанс. Если сеанс не найден, он перенаправляет пользователя. Это код клиента, а не безопасное исправление, конечно, но выглядит лучше.

Вы можете получить это от своей совести с помощью

Дешевое исправление, если все остальное провалилось, было бы сообщением "Пожалуйста, закройте это окно по соображениям безопасности" на странице выхода. - izb 9 мая '12 в 8:36

Но, как и N.B. сказал

Вам не нужно ничего отключать. Если они вернутся, они будут обслуживать кешированную версию закрытой страницы. Если они попытаются щелкнуть по нему, ничего не будет работать, потому что соответствующий сеанс не будет установлен. - N.B. 9 мая в 7:50

Ответ 4

Вы можете вставить условие/функцию на каждую ограниченную страницу, проверяя, установлена ​​ли соответствующая переменная сеанса или нет. Таким образом, вы можете распечатать две версии страницы (одна для действительных пользователей и одна переадресация на страницу входа в систему)

Ответ 5

Избегание возврата пользователя не является хорошей причиной и, самое главное, не защищено.

Если вы проверите сеанс пользователя перед каждым действием "admin", сделанным на веб-сайте, вы должны быть в порядке, даже если пользователь нажимает кнопку "Назад", видит кэшированную страницу и пытается что-то сделать.

"Связывает что-то" вернет ошибку, так как сеанс больше не действителен.

Вместо этого вам следует сосредоточиться на действительно защищенном офисе.

Ответ 6

Здесь легко и быстро.

В тег формы входа добавьте target="_blank", который отображает содержимое в другом окне. Затем после выхода из системы просто закройте это окно и проблема с кнопкой "Назад" (браузер Safari) будет решена.

Даже попытка использовать историю не отображает страницу и вместо этого перенаправляется на страницу входа. Это нормально для браузеров Safari, но для других, таких как Firefox, session_destroy(); позаботится об этом.

Ответ 7

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

Ответ 8

Обратите внимание: хотя пользователи не могут ничего изменить после сброса данных сеанса и/или файлов cookie, они все равно могут видеть обычную информацию, доступную зарегистрированному пользователю, как они появились в последнем посещении. Это вызвано тем, что браузер кэширует страницу.

Вы должны обязательно добавить заголовок на каждую страницу, доступную зарегистрированному пользователю, сообщая браузеру, что данные чувствительны, и они не должны кэшировать результат script для кнопки "Назад". Важно добавить

header("Cache-Control: no-cache, must-revalidate");

Обратите внимание, что эти другие элементы, кроме непосредственного результата script в этом заголовке, будут кэшироваться, и вы можете извлечь из этого выгоду. Посмотрите, что вы постепенно загружаете части своей страницы и сохраняете теги конфиденциальных данных и основной HTML с этим заголовком.

Как следует из ответа, отмена части logged_in глобальной переменной $_SESSION может привести к выходу из системы, но помните, что сначала вам не нужно уничтожать сеанс, как указано в PHP session_destroy() documentation

Примечание. Вам не нужно вызывать session_destroy() из обычного кода. Очистка $_SESSION, а не уничтожение данных сеанса.

И, во-вторых, лучше не уничтожать сеанс вообще, как объясняется следующее предупреждение в документации.

Кроме того, unset() является ленивой функцией; что это не будет применять эффект, до следующего использования рассматриваемой переменной (части). Эффективная практика заключается в использовании назначения для немедленного эффекта в чувствительных случаях, в основном глобальных переменных, которые могут использоваться в параллельных запросах. Я предлагаю вам использовать это вместо:

$_SESSION['logged_in'] = null;

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

Наконец, для завершения решения. Вот некоторые функции:

<?php
/*
 * Check the authenticity of the user
 */
function check_auth()
{
   if (empty($_SESSION['logged_in']))
   {
      header('Location: login.php');
      // Immediately exit and send response to the client and do not go furthur in whatever script it is part of.
      exit();
   }
}

/*
 * Logging the user out
 */
function logout()
{
   $_SESSION['logged_in'] = null;
   // empty($null_variable) is true but isset($null_variable) is also true so using unset too as a safeguard for further codes
   unset($_SESSION['logged_in']);
   // Note that the script continues running since it may be a part of an ajax request and the rest handled in the client side.
}

Ответ 9

Добавьте код ниже внутри тега script на странице входа в систему (или на любой странице, на которую он перенаправляется после выхода из системы)

<script>
history.pushState(null, null, document.title);
window.addEventListener('popstate', function () {
    history.pushState(null, null, document.title);
});
</script>

Этот script отключит кнопку "Назад" после выхода из системы.