23

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

该人进入该页面,被提示登录,然后查看信息。

该人退出站点,并被重定向回登录页面。

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

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

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

4

16 回答 16

13

简短的回答是它不能安全地完成。

但是,可以实施许多技巧,使用户难以回击并显示敏感数据。

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

这将禁用客户端的缓存,但并非所有浏览器都支持

如果您可以选择使用 AJAX,则可以使用从客户端代码更新的更新面板检索敏感数据,因此除非客户端仍然登录,否则在回击时不会显示敏感数据。

于 2008-09-17T22:48:08.180 回答
9

缓存和历史是独立的,不应相互影响。

银行的唯一例外是 HTTPS 和Cache-Control: must-revalidate历史导航时强制刷新的组合。

在纯 HTTP 中,除了利用浏览器错误之外,没有其他方法可以做到这一点。

您可以使用 Javascript 在设置“杀手”cookie 时检查document.cookie和重定向来破解它,但我想当浏览器没有完全按预期设置/清除 cookie 时,这可能会出现严重错误。

于 2008-10-19T22:57:25.233 回答
3

来自aspdev.org

在 Page_Load 事件处理程序顶部添加以下行,您的 ASP.NET 页面将不会缓存在用户浏览器中:

Response.Cache.SetCacheability(HttpCacheability.NoCache)

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

于 2008-09-15T15:44:06.470 回答
1

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

于 2008-09-15T16:10:46.140 回答
1

dannyp 和其他人,no-cache 不会阻止缓存存储敏感资源。它仅仅意味着缓存不能在不首先重新验证它的情况下为它存储的资源提供服务。如果您希望防止敏感资源被缓存,则需要使用 no-store 指令。

于 2008-09-15T16:14:19.423 回答
1

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

于 2009-04-20T15:53:22.983 回答
0

您正在寻找一个无缓存指令:

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

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

如果您设置了此指令,浏览器将尽职尽责地返回服务器寻找页面的全新副本,这将导致您的服务器看到用户未通过身份验证并将他撞到登录页面。

于 2008-09-15T15:44:29.917 回答
0

让注销操作成为POST. 然后浏览器会提示“您确定要重新发布表单吗?” 而不是显示页面。

于 2008-09-15T15:44:57.467 回答
0

我不知道如何在 ASP.NET 中执行此操作,但在 PHP 中我会执行以下操作:

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

这会迫使浏览器重新检查该项目,因此应该触发您的身份验证检查,拒绝用户访问。

于 2008-09-15T15:45:26.420 回答
0

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

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

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

于 2008-09-15T15:45:31.363 回答
0

这有点紧张,但如果你有一个嵌入的 Java 小程序或 Flash 应用程序,并且通过它完成了身份验证,你就可以做到这一点,这样他们就必须每次都在服务器上“实时”地进行身份验证他们想查看信息。

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

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

于 2008-09-15T15:55:56.720 回答
0

为了完整性:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));
于 2008-09-15T15:59:16.307 回答
0

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

于 2008-09-15T18:13:40.743 回答
0

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

O'Reilly的花栗鼠书是 HTTP 的圣经,Chris Shiflett 的 HTTP 书也很好。

于 2008-09-20T06:00:40.347 回答
0

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

于 2009-01-06T16:17:25.257 回答
0

我只是想到了银行业的例子。

我的银行页面里面有这个:

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

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

于 2009-04-20T09:48:58.537 回答