Запретить отображение предыдущих страниц после выхода из системы - PullRequest
2 голосов
/ 12 августа 2010

Я работаю в PHP-приложении, но у меня возникла проблема, фактически, когда пользователь вышел из системы и нажал после выхода из браузера кнопку «Назад», он может видеть предыдущую страницу, как будто сеанс не был уничтожен :( (Я перепробовал все, что нашел здесь и в Интернете, но это не сработало: '(

Можно ли отключить кнопку возврата?

Ответы [ 6 ]

2 голосов
/ 24 сентября 2014

http://blog.priyakant.com/2014/09/23/browser-back-button-prevent/

Резюме:

Кнопка возврата в браузере - Запретить отображение предыдущих страниц после выхода из системы - Подход на основе файлов cookie Опубликовано 23 сентября 2014 года Приякант Патель - Оставить комментарий Запретить отображение предыдущих страниц после выхода из системы

Клиентское браузерное приложение кэширует страницу по соображениям производительности. В этом случае, когда пользователь нажимает кнопку «Назад» (кнопка «Назад» в браузере), отображается предыдущая страница из кэша.

Случай 1: пользователь все еще вошел в систему.

нормально отображать содержимое предыдущей страницы.

Случай 2: пользователь вышел из системы.

Потенциально следующий пользователь может нажать на кнопку «Назад» в браузере и просмотреть содержимое предыдущей страницы.

Это может быть большой проблемой во многих приложениях. В финансовом приложении потенциальный пользователь может видеть финансовые данные. Или заявление, связанное с медицинским обслуживанием / пациентами, это может быть нарушением HIPAA, и компании могут быть назначены большие штрафы.

Итак, вернемся к делу. Как можно решить эту проблему?

Я предлагаю подход HTTP Cookie.

Шаги:

Создание HTTP Cookie со стороны сервера с скользящим сроком действия. К которым можно получить доступ из клиентского JavaScript (Примечание. Браузер очищает этот файл cookie по истечении срока действия).
Очистить этот файл cookie при выходе из системы
Если вы не нашли этот Cookie, перезагрузите страницу. В этом случае сервер повторно аутентифицирует страницу и при необходимости перенаправляет на страницу входа
Вот и все, готово!

Вот моя реализация с использованием ASP.NET. Реализация будет варьироваться в зависимости от серверной технологии, но идея остается прежней.

  1. (на стороне сервера). Создать HTTP Cookie со стороны сервера с скользящим сроком действия

    Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow.AddMinutes(10) });
    //NOTE 10 == Session Timeout. This will be same as your application login session timeout.
    
  2. (на стороне сервера). Очистить этот файл cookie при выходе из системы

    Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow});
    
  3. (на стороне клиента): (следующий скрипт должен существовать сразу после тега BODY)

    window.preventBackButton = function () {
        try {
            if (document && (!document.cookie || document.cookie.indexOf('_tc=1') < 0)) {
                window.document.body.style.display = 'none'; window.location = window.location;
            }
        } catch (e) { }
    };
    window.preventBackButton(); //Call immediately after body tag
    

Пожалуйста, найдите реализацию ASP.NET следующим образом:

////C# Helper class - Start
using System;
using System.Web;

namespace MyHelpers {
    public static class MyHtmlHelper {
        public const string TimeoutCookieName = "_tc";

        public static HtmlString PreventBackButtonScript(HttpResponseBase response) {
            response.SetCookie(new HttpCookie(TimeoutCookieName, "1") { Expires = DateTime.UtcNow.AddMinutes(10) });
            var clientScript = "window.-reventBackButton = function() {
                try {
                    if(document && (!document.cookie || document.cookie.indexOf('" + TimeoutCookieName + "=1') < 0)) {
                        window.document.body.style.display='none'; window.location = window.location;
                    }
                } catch(e) {}
            };
            window.preventBackButton();";

            return new HtmlString(clientScript);
        }

        public static void SafeUnSetTimeoutCookie(this HttpResponseBase response) {
            response.SetCookie(new HttpCookie(TimeoutCookieName, "0") { Expires = DateTime.UtcNow.AddYears(-5) });
        }
    }
}
////C# Helper class - End
//Shared\_Layout.cshtml
//Make sure not to include after logout OR login page
<html>
<body>
@MyHelpers.MyHtmlHelper.PreventBackButtonScript(Response)
.
.
<⁄body>
<⁄html>
1 голос
/ 12 августа 2010

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

Пример отключения кэширования страницы здесь http://www.w3schools.com/php/func_http_header.asp:

// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
0 голосов
/ 12 августа 2010

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

0 голосов
/ 12 августа 2010

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

0 голосов
/ 12 августа 2010

Вы очищаете кеш / сеанс пользователя?Даже если они нанесут ответный удар, я не думаю, что они должны оставаться в системе, если вы очистите их сеанс при выходе из системы.

0 голосов
/ 12 августа 2010

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

Вы можете сделать так, чтобы ваше приложение ломалось (отображало сообщение об ошибке, требующее, чтобы пользователь перезапустил или повторно отправил запрос), если пользовательИдет назад.Это плохая идея, потому что это действительно признание того, что вы не приняли во внимание кнопку «Назад» при разработке приложения.Каждое приложение, даже бланки заказов, корзины покупок и т. Д., Если они правильно спроектированы, должно иметь возможность использовать кнопку «назад».

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

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

Приложение для онлайн-банкинга, которое предоставляет мой банк, выглядит следующим образом.Если вы вообще используете кнопку «назад», ссылки больше не будут работать, и больше не будет возможности перезагрузить страницу - вместо этого вы увидите уведомление о том, что вы не можете вернуться назад, и вам нужно начать все сначала.

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

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