我有一些网站需要登录并显示敏感信息。

用户进入该页面,系统会提示您登录,然后即可查看信息。

该用户注销该站点,并被重定向回登录页面。

然后,该人可以点击“返回”并直接返回到包含敏感信息的页面。由于浏览器只是将其视为呈现的 HTML,因此向他们显示它没有问题。

有没有办法防止当用户从注销屏幕点击“后退”按钮时显示该信息?我并不是想禁用后退按钮本身,我只是想阻止敏感信息再次显示,因为该人不再登录该网站。

为了便于讨论,上面的站点/场景是在带有表单身份验证的 ASP.NET 中(因此,当用户转到第一页(他们想要的页面)时,他们会被重定向到登录页面 - 以防万一的差异)。

有帮助吗?

解决方案

简而言之,它无法安全地完成。

然而,有很多技巧可以使用户难以反击并显示敏感数据。

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)

设置此属性可确保如果用户点击后退按钮,内容将消失,如果他按“刷新”,他将被重定向到登录页面。

DannySmurf,<meta> 元素在控制缓存方面非常不可靠,尤其是 Pragma 更是如此。 参考.

dannyp 等人认为,no-cache 不会阻止缓存存储敏感资源。它仅意味着缓存无法为其所存储的资源提供服务,除非先重新验证该资源。如果您希望阻止敏感资源被缓存,则需要使用 no-store 指令。

您可以使用 JavaScript 函数进行快速服务器检查(ajax),如果用户未登录,则擦除当前页面并用消息替换它。显然,对于 JavaScript 已关闭的用户来说,这很容易受到攻击,但这种情况非常罕见。从好的方面来说,这与浏览器和服务器技术(asp/php 等)无关。

您正在寻找无缓存指令:

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

如果您正在进行母版页设计,这可能有点麻烦,但我相信您可以将此指令放在单个页面上,而不会影响网站的其余部分(假设这就是您想要的)。

如果您设置了此指令,浏览器将尽职地返回服务器寻找页面的全新副本,这将导致您的服务器发现用户未经身份验证并将其引导至登录页面。

注销操作是 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 应用程序,并且通过它们完成身份验证,您可以做到这一点,以便他们每次都必须与服务器进行“实时”身份验证他们想查看信息。

使用它您还可以加密任何信息。

总是有可能有人可以保存带有敏感信息的页面,没有缓存并不能解决这种情况(但是总是可以对 Flash 或 Java 应用程序进行屏幕截图)。

为了完整性:

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

正确的答案涉及在响应上设置 HTTP Cache-Control 标头。如果您想确保他们 绝不 缓存输出,你可以做Cache-Control:无缓存。这也经常与 no-store 配合使用。

如果您想要有限的缓存,其他选项包括设置过期时间和必须重新验证,但这些都可能会导致缓存的页面再次显示。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

好吧,在一家以拥有世界上最安全、最高效的家庭银行软件而闻名的巴西大型银行公司(Banco do Brasil)中,他们只是将 History.go(1) 放在每个页面中。所以,如果您点击按后退按钮,您将返回。简单的。

请查看 HTTP 响应标头。人们发布的大多数 ASP 代码看起来都是在设置这些。确定。

O'Reilly 的花栗鼠书 是 HTTP 的圣经,并且 Chris Shiflett 的 HTTP 书 也不错。

您可以将包含敏感信息的网页作为 HTTP POST 返回,然后在大多数情况下,浏览器会向您显示消息,询问您是否要重新提交数据。(不幸的是,我找不到这种行为的规范来源。)

我只想到银行业的例子。

我的银行页面有这样的内容:

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

我想这应该是关于这个的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top