关于asp.net:一旦有人注销但单击“返回”按钮,是否有一种方法可以阻止页面渲染?

关于asp.net:一旦有人注销但单击“返回”按钮,是否有一种方法可以阻止页面渲染?

Is there a way to keep a page from rendering once a person has logged out but hit the “back” button?

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

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

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

然后,此人可以单击"后退"并直接返回到包含敏感信息的页面。由于浏览器只是将其视为呈现的HTML,因此可以毫无问题地显示给他们。

当有人从注销的屏幕上单击"后退"按钮时,是否有办法防止显示该信息?我并不是要禁用后退按钮本身,而是只是为了防止再次显示敏感信息,因为该人不再登录该网站。

出于争论的考虑,上述站点/场景位于具有表单身份验证的ASP.NET中(因此,当用户转到第一页(即他们想要的页面)时,他们将被重定向到登录页面-如果发生这种情况,差异)。


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

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

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

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

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


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

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

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

您可以使用Java技术来检查它,并检查document.cookie并在设置"杀手" cookie时重定向,但是我认为当浏览器未完全按照预期设置/清除cookie时,这可能会严重出错。


从aspdev.org:

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

1
Response.Cache.SetCacheability(HttpCacheability.NoCache)

设置此属性可确保如果用户单击后退按钮,则内容将消失,并且如果用户单击"刷新",则将其重定向到登录页面。


dannyp等,no-cache不会阻止缓存存储敏感资源。这仅意味着高速缓存无法服务于已存储的资源,而无需先对其进行重新验证。如果希望防止缓存敏感资源,则需要使用no-store指令。


DannySmurf中的元素在控制缓存方面极其不可靠,尤其是Pragma。参考。


您可能有一个javascript函数来执行快速服务器检查(ajax),如果用户未登录,则擦除当前页面并用消息替换它。显然,这对不支持javascript的用户来说很脆弱,但这很少见。从好的方面来说,这与浏览器和服务器技术(asp / php等)无关。


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


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

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


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


我只是想起银行业的例子。

我银行的页面上有这个:

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

我想应该是关于这个的。


这有点麻烦,但是如果您有一个嵌入式的Java applet或Flash应用程序并且通过身份验证完成,则可以这样做,以便他们每次必须通过服务器"实时"进行身份验证。他们想查看信息。

使用此方法,您还可以加密任何信息。

总是存在这样的可能性,即有人可以只保存带有敏感信息的页面,没有缓存并不能解决这种情况(但是,可以始终从Flash或Java应用程序中截取屏幕截图)。


正确答案包括使用在响应上设置HTTP Cache-Control标头。如果要确保它们从不缓存输出,则可以执行Cache-Control:no-cache。这通常也与无商店配合使用。

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

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


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

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

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


使注销操作为POST。然后浏览器将提示您"您确定要重新发布该表单吗?"而不是显示页面。


您正在寻找无缓存指令:

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

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

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


为了完整性:

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


推荐阅读