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