Я не хочу, чтобы пользователь возвращался на защищенные страницы, нажав кнопку «Назад» после выхода из системы. В моем коде выхода я отменяю сеансы и перенаправляюсь на страницу входа. Но я думаю, что браузер кэширует страницу, чтобы она стала видимой, несмотря на то, что сеанс был уничтожен при выходе из системы.
Я могу избежать этого, не позволяя браузеру кэшировать
header("Cache-Control", "no-cache, no-store, must-revalidate")
Но таким образом я теряю преимущество браузера кэширования.
Пожалуйста, предложите лучший способ добиться этого. Я чувствую, должен быть способ справиться с этим на стороне клиента javascript
Реализуйте это в PHP, а не в javascript.
В верхней части каждой страницы проверьте, вошел ли пользователь в систему. Если нет, они должны быть перенаправлены на страницу входа:
<?php if(!isset($_SESSION['logged_in'])) : header("Location: login.php"); ?>
Как вы упомянули, при выходе из системы просто отключите переменную сеанса logged_in и уничтожьте сеанс:
<?php unset($_SESSION['logged_in']); session_destroy(); ?>
с<?php unset($_SESSION['logged_in']); session_destroy(); ?>
Если пользователь нажимает кнопку «назад», переменная сеанса logged_in не будет доступна, и страница не будет загружаться.
Я столкнулся с этой же проблемой и провел целый день, выяснив ее, наконец, исправив ее следующим образом:
В скрипте проверки подлинности пользователя, если пользователь аутентифицирован, установите одно значение сеанса, например, следующим образом:
$_SESSION['status']="Active";
А затем в скрипте User Profile поставьте следующий фрагмент кода:
<?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"); }
Надеюсь это поможет…!!!
Я думаю, что ваш единственный вариант на стороне сервера – это запретить кеширование. Это на самом деле не так уж плохо, если вы используете тяжелое приложение Javascript, поскольку ваш основной HTML может быть только серией JS-вызовов, а Views затем генерируются «на лету». Таким образом, основная часть данных (JS MVC и основной код) кэшируется, но фактический запрос страницы отсутствует.
Чтобы добавить к комментариям, вставленным ниже, я бы предложил добавить небольшой вызов AJAX во время загрузки, который срабатывает даже для кэшированных страниц, которые идут на ваш сервер и проверяет сеанс. Если сеанс не найден, он перенаправляет пользователя. Это клиентский код, а не безопасное исправление, конечно, но выглядит лучше.
Вы можете получить это от своей совести с
Дешевое исправление, если все остальное провалилось, было бы сообщением «Пожалуйста, закройте это окно по соображениям безопасности» на странице, выведенной из системы. – Изб 9 мая '12 в 8:36
Но, как сказал Н.Б.
Вам не нужно ничего отключать. Если они вернутся, они будут обслуживать кешированную версию закрытой страницы. Если они попытаются щелкнуть по нему, ничего не будет работать, потому что соответствующий сеанс не будет установлен. – NB 9 мая 12 в 7:50
Вы можете вставить условие / функцию на каждую ограниченную страницу, проверяя, установлена ли соответствующая переменная сеанса или нет. Таким образом, вы можете распечатать две версии страницы (одна для действительных пользователей и одно перенаправление на страницу входа)
Избежать возвращения пользователя не является хорошей причиной и, самое главное, не защищено.
Если вы проверяете сеанс пользователя перед каждым действием «admin», сделанным на веб-сайте, вы должны быть в порядке, даже если пользователь нажимает кнопку «Назад», видит кэшированную страницу и что-то пытается.
«Связывает что-то» вернет ошибку, так как сеанс больше недействителен.
Вместо этого вам следует сосредоточиться на действительно защищенном офисе.
Вот простое и быстрое решение.
В тег формы входа добавьте target="_blank"
который отображает содержимое в другом окне. Затем после выхода из системы просто закройте это окно и проблема с кнопкой «Назад» (браузер Safari) будет решена.
Даже попытка использовать историю не отображает страницу и вместо этого перенаправляется на страницу входа. Это нормально для браузеров Safari, но для других, таких как Firefox session_destroy();
заботится об этом.
страницы, на которые вы должны были войти в систему, используйте setInterval
за каждые 1000 мс и проверьте, что пользователь вошел в систему или не использовал ajax. если пользовательский сеанс недействителен, перенаправите его на страницу входа.
Обратите внимание, что, хотя пользователи не могут ничего изменить после сброса данных сеанса и / или файлов cookie, они все равно могут видеть обычную информацию, доступную зарегистрированному пользователю, как они появились в последнем посещении. Это вызвано тем, что браузер кэширует страницу.
Вы должны обязательно добавить заголовок на каждую страницу, доступную зарегистрированному пользователю, сообщая браузеру, что данные чувствительны, и они не должны кэшировать результат скрипта для кнопки «Назад». Важно добавить
header("Cache-Control: no-cache, must-revalidate");
Обратите внимание, что эти другие элементы, отличные от непосредственного результата скрипта в этом заголовке, будут кэшироваться, и вы можете извлечь из этого выгоду. Посмотрите, что вы постепенно загружаете части своей страницы и отмечаете важные данные и основной HTML с этим заголовком.
Как следует из ответа, logged_in
части logged_in
глобальной переменной $_SESSION
может привести к выходу из системы, но имейте в виду, что сначала вам не нужно уничтожать сеанс, как указано в документации PHP session_destroy()
Примечание. Вам не нужно вызывать 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. }
с<?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. }