【问题标题】:Prevent displaying of previous pages after logout注销后防止显示以前的页面
【发布时间】:2011-03-28 21:37:04
【问题描述】:

我正在使用 PHP 应用程序,但我遇到了麻烦,事实上,当用户注销并在注销浏览器的后退按钮后按下时,他可以看到上一页,就好像会话没有被破坏一样:( (我已经尝试了我在这里和网络上找到的所有东西,但它不起作用:'(

我可以禁用后退按钮吗?

【问题讨论】:

标签: php button logout back


【解决方案1】:

编辑:在编辑之前 - 由 OP 以外的人 - 这个问题询问是否可以禁用浏览器的后退按钮。我对这个问题的原始答案如下。另外,我觉得我需要澄清一下——以下基本上“打破”后退按钮的方法不是我推荐或喜欢的方法。您应该将您的应用程序设计为在使用后退按钮等基本浏览器功能时做出明智的反应,而不是试图阻止它们的使用。

您不能禁用用户浏览器上的后退按钮。这是浏览器的一个基本特性,不能被覆盖。

您可以让您的应用程序在用户返回时中断(显示错误消息,要求用户重新开始或重新提交请求)。这样做是个坏主意,因为这实际上是在承认您在设计应用程序时没有考虑后退按钮。如果设计正确,每个应用程序,甚至是订单表格、购物车等都应该能够使用返回按钮。

我见过的一种打破后退按钮使用的方法是在应用程序和每个表单中的每个 URL 上传递一个令牌。令牌会在每个页面上重新生成,一旦用户加载新页面,之前页面中的任何令牌都会失效。

当用户加载页面时,该页面仅在正确的令牌(已提供给前一页面上的所有链接/表单)被传递给它时才会显示。

我的银行提供的网上银行应用程序是这样的。如果您完全使用后退按钮,则无法再使用任何链接,也无法重新加载页面 - 相反,您会看到一条通知,告诉您无法返回,您必须重新开始。

也就是说,我应该提醒您,让您的应用程序在用户返回时中断是一个坏主意,并且显示出糟糕的应用程序设计。

【讨论】:

  • 这甚至没有开始解决问题
  • 我回答的问题与此不同。基本上是“是否可以禁用浏览器的后退按钮”
【解决方案2】:

http://blog.priyakant.com/2014/09/23/browser-back-button-prevent/

总结:

浏览器后退按钮 - 注销后防止显示以前的页面 - 基于 Cookie 的方法 发表于 2014 年 9 月 23 日,由 Priyakant Patel — 发表评论 退出后防止显示以前的页面

客户端浏览器应用程序出于性能原因缓存页面。在这种情况下,当用户单击返回(浏览器返回按钮)时,它会显示缓存中的上一页。

案例 1:用户仍处于登录状态。

可以显示上一页的内容。

案例 2:用户已注销。

可能下一个用户可以点击浏览器后退按钮并可以看到上一页的内容。

这在许多应用程序中可能是个大问题。在金融应用下一个用户潜力可以看到金融数据。或与医疗/患者相关的应用,这可能违反 HIPAA,公司可能面临巨额处罚。

那么让我们回到正题,如何解决这个问题?

我提出了基于 HTTP Cookie 的方法。

步骤:

通过滑动过期从服务器端创建 HTTP Cookie。可以从客户端 JavaScript 访问(注意:浏览器会在过期时清除此 Cookie)。
注销时清除此 cookie
如果您没有找到此 Cookie,请重新加载页面。在这种情况下,服务器会重新验证页面,如有必要,它将重定向到登录页面
就是这样,完成!

这是我使用 ASP.NET 实现的。实现会因服务器技术而异,但想法保持不变。

  1. (服务器端)。通过滑动过期从服务器端创建 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.
    
  2. (服务器端)。注销时清除此 cookie

    Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow});
    
  3. (客户端):(以下脚本必须紧跟在 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>

【讨论】:

    【解决方案3】:

    这可能更多地与您在每个页面请求中发回的缓存标头有关。您的内容仅在短时间内有效,因此您需要确保在生成页面时将标头发回,告诉浏览器不要在本地缓存它。

    此处禁用页面缓存的示例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");
    

    【讨论】:

      【解决方案4】:

      你不能。浏览器缓存页面,因此它们不必在每次加载页面时都从 Web 服务器请求它。当您点击后退按钮时,它会加载最后一页而不询问服务器。

      【讨论】:

        【解决方案5】:

        您不能禁用后退按钮。如果您可以看到以前注销的用户页面,那么您的会话检查脚本会在某处失败。提交注销表单时使用流程脚本,然后将当前注销的用户重定向到主页(如果适用)。

        【讨论】:

          【解决方案6】:

          您是否正在清除用户的缓存/会话?即使他们反击,如果您在注销时清除他们的会话,我认为不应该让他们保持登录状态。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-15
            • 2013-03-15
            • 2020-05-13
            • 2017-06-30
            • 2015-02-10
            • 2023-02-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多