我正在使用 PHP 应用程序,但我遇到了麻烦,事实上,当用户注销并在注销浏览器的后退按钮后按下时,他可以看到上一页,就好像会话没有被破坏一样:((我有尝试了我在这里和网上找到的所有东西,但它不起作用:'(
我可以禁用后退按钮吗?
http://blog.priyakant.com/2014/09/23/browser-back-button-prevent/
概括:
浏览器后退按钮 – 注销后阻止显示以前的页面 – 基于 Cookie 的方法 Priyakant Patel 发表于 2014 年 9 月 23 日 — 发表评论 退出后阻止显示以前的页面
客户端浏览器应用程序出于性能原因缓存页面。在这种情况下,当用户单击返回(浏览器返回按钮)时,它会显示缓存中的上一页。
案例1:用户仍然登录。
可以显示上一页的内容。
情况 2:用户已注销。
潜在的下一个用户可以点击浏览器后退按钮并可以看到前一页的内容。
这在许多应用程序中可能是个大问题。在金融应用下一个用户潜力可以看到金融数据。或与医疗/患者相关的应用,这可能违反 HIPAA,公司可能面临巨额处罚。
那么让我们回到正题,如何解决这个问题?
我提出了基于 HTTP Cookie 的方法。
脚步:
从服务器端创建具有滑动到期的 HTTP Cookie。可以从客户端 JavaScript 访问(注意:浏览器在过期时清除此 Cookie)。
注销时清除此 cookie
如果您没有找到此 cookie,请重新加载页面。在这种情况下,服务器重新验证页面,如有必要,它将重定向到登录页面
就是这样,完成!
这是我使用 ASP.NET 的实现。实施将根据服务器技术而有所不同,但想法保持不变。
(服务器端)。使用滑动过期从服务器端创建 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.
(服务器端)。注销时清除此 cookie
Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow});
(客户端):(以下脚本必须紧跟在 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>
您不能禁用后退按钮。如果您可以看到以前注销的用户页面,那么您的会话检查脚本会在某处失败。提交注销表单时使用流程脚本,然后将当前注销的用户重定向到主页(如果适用)。
你不能。浏览器缓存页面,因此它们不必在每次加载页面时都从 Web 服务器请求它。当您点击后退按钮时,它会加载最后一页而不询问服务器。
这可能更多地与您在每个页面请求上发回的缓存标头有关。您的内容仅在短时间内有效,因此您需要确保在生成页面时发回标头,告诉浏览器不要在本地缓存它。
此处禁用页面缓存的示例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");
您是否正在清除用户的缓存/会话?即使他们回击,我认为如果您在注销时清除他们的会话,也不应该让他们保持登录状态。
编辑:在编辑之前 - 由 OP 以外的人 - 这个问题询问是否可以禁用浏览器的后退按钮。我对这个问题的原始答案如下。另外,我觉得我需要澄清一下——以下基本上“打破”后退按钮的方法不是我推荐或喜欢的方法。您应该将应用程序设计为在使用后退按钮等基本浏览器功能时做出明智的反应,而不是试图阻止它们的使用。
您不能禁用用户浏览器上的后退按钮。这是浏览器的一个基本特性,不能被覆盖。
如果用户返回,您可以使您的应用程序中断(显示错误消息,要求用户重新开始或重新提交请求)。这样做是个坏主意,因为这实际上是在承认您在设计应用程序时没有考虑后退按钮。如果设计正确,每个应用程序,甚至是订单表格、购物车等,都应该能够使用后退按钮。
我见过的一种打破后退按钮使用的方法是在应用程序中的每个 URL 以及每个表单中传递一个令牌。令牌会在每个页面上重新生成,一旦用户加载新页面,之前页面中的任何令牌都会失效。
当用户加载页面时,页面只会显示正确的令牌(已提供给前一页上的所有链接/表单)是否已传递给它。
我的银行提供的网上银行应用程序是这样的。如果您完全使用后退按钮,则无法再使用任何链接,也无法重新加载页面 - 相反,您会看到一条通知,告诉您无法返回,您必须重新开始。
也就是说,我应该提醒你,当用户返回时让你的应用程序中断是一个坏主意,并且显示出糟糕的应用程序设计。