Есть ли способ предотвратить рендеринг страницы, когда человек вышел из системы, но нажал кнопку "Назад"?

У меня есть веб-сайт, который требует входа в систему и показывает конфиденциальную информацию.

Человек переходит на страницу, получает запрос на вход в систему, а затем получает информацию.

Человек выходит из сайта и перенаправляется обратно на страницу входа.

Затем человек может нажать "назад" и вернуться обратно на страницу, где содержится конфиденциальная информация. Так как браузер просто думает об этом как о визуализированном HTML, он показывает им это без проблем.

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

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

16 ответов

Решение

Краткий ответ: это невозможно сделать безопасно.

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

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");

Это отключит кэширование на стороне клиента, однако это поддерживается не всеми браузерами.

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

Кэш и история независимы и не должны влиять друг на друга.

Единственным исключением, сделанным для банков, является то, что комбинация HTTPS и Cache-Control: must-revalidate заставляет обновляться при навигации по истории.

В обычном HTTP нет никакого способа сделать это, кроме как с помощью ошибок браузера.

Вы можете взломать его, используя Javascript, который проверяет document.cookie и перенаправляет, когда установлен "убийственный" файл cookie, но я полагаю, что это может серьезно испортиться, если браузер не устанавливает / удаляет файлы cookie точно так, как ожидалось.

С aspdev.org:

Добавьте следующую строку поверх обработчика события Page_Load, и ваша страница ASP.NET не будет кэшироваться в браузерах пользователей:

Response.Cache.SetCacheability(HttpCacheability.NoCache)

Настройки этого свойства гарантируют, что если пользователь нажмет кнопку "Назад", контент исчезнет, ​​а если он нажмет "обновить", он будет перенаправлен на страницу входа.

Вы могли бы иметь функцию javascript, которая выполняет быструю проверку сервера (ajax) и, если пользователь не вошел в систему, стирает текущую страницу и заменяет ее сообщением. Это, очевидно, будет уязвимо для пользователя, у которого отключен JavaScript, но это довольно редко. С другой стороны, это не зависит от браузерной и серверной технологии (asp / php и т. Д.).

dannyp и другие, no-cache не мешает кешам хранить конфиденциальные ресурсы. Это просто означает, что кеш не может обслуживать ресурс, который он сохранил, без его повторной проверки. Если вы хотите предотвратить кэширование конфиденциальных ресурсов, вам нужно использовать директиву no-store.

DannySmurf, элементы крайне ненадежны, когда речь идет об управлении кэшированием, а в особенности Pragma - тем более. Ссылка

Для полноты:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));

Вы ищете директиву без кэширования:

<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

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

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

Я просто имел в виду пример банковского дела.

На странице моего банка есть это:

<meta http-equiv="expires" content="0" />

Это должно быть об этом, я полагаю.

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

Я не знаю, как это сделать в ASP.NET, но в PHP я бы сделал что-то вроде:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

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

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

Используя это, вы также можете зашифровать любую информацию.

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

Что ж, в крупной бразильской банковской корпорации (Banco do Brasil), которая известна наличием одного из самых безопасных и эффективных программ для банковского обслуживания в мире, они просто помещают history.go(1) на каждую страницу. Итак, если вы нажмете Кнопка Назад, вы вернетесь. Просто.

Пожалуйста, посмотрите в заголовки HTTP-ответа. Большая часть кода ASP, который публикуют люди, похоже, устанавливает их. Быть уверенным.

Книга о бурундуке от О'Рейли - это библия HTTP, и книга Криса Шифлетта также хороша.

Правильный ответ предполагает использование в заголовке HTTP-заголовка Cache-Control. Если вы хотите убедиться, что они никогда не кэшируют вывод, вы можете сделать Cache-Control: no-cache. Это часто используется в координации с магазином.

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

См. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html.

Пусть операция выхода из системы будет POST, Затем браузер предложит "Вы уверены, что хотите повторно опубликовать форму?" а не показывать страницу.

Другие вопросы по тегам