【问题标题】:prevent back button after logout page退出页面后防止返回按钮
【发布时间】:2012-04-18 11:39:04
【问题描述】:

我有 php 注销页面。当用户单击注销链接时,请查看此页面并重定向到索引页面。但是当单击后退按钮时,我会看到带有用户数据的上一页。当然,当我刷新页面时,我看不到以前的页面和数据。单击注销并单击返回按钮后,我检查了其他代码( drupal ),我看不到上一个页面并看到登录页面。我的问题在哪里。如何解决这个问题?

注销页面:

if (isset($_GET['req']) && $_GET['req'] == 'logout') {
      session_start();
      session_destroy();
      header("Location: index.php");
   exit();
}

谢谢

【问题讨论】:

  • 用PHP做不到,需要用JS来做
  • “上一个”页面仍会在浏览器的缓存中。如果您想阻止对需要主动登录的页面进行“返回”操作,则必须将它们设为不可缓存。
  • 使它们不可缓存不会阻止浏览器将它们存储在历史记录中...imo
  • 不要对 get 请求进行会话操作,尤其是登录和注销请求。改用 POST,我认为 drupal 也可以使用 post。

标签: php mysql session redirect


【解决方案1】:

代码是正确的。实际上,您不需要阻止人们单击后退按钮。如果你真的认为这很重要,你可以在 logout.php 中保存一个 cookie 或其他内容,然后主页会使用 AJAX 检查是否设置了这个 cookie。如果是这样,您可以使用 JS 重新加载页面(当然然后取消设置 cookie)。但并不存在真正安全的方法。

【讨论】:

    【解决方案2】:

    我认为这主要是客户端问题,并且由于浏览器缓存标头。

    解决方法是什么?

    在我看来,您需要为静态内容和非静态内容正确设置缓存标头

    静态内容(css/javascript/images):read this

    对于 php 页面本身:header("Cache-Control", "no-store, no-cache, must-revalidate");

    应该做的伎俩

    【讨论】:

      【解决方案3】:

      您实际上是在询问如何清除用户的浏览器历史记录和他们有权访问但不再这样做的页面的缓存。当您注销用户时,您将取消他们重新加载页面的能力,并且几乎没有(如果有的话)可以阻止浏览器向他们显示他们一次允许加载的内容(这是陈旧的数据)。重要的是,当它们重新加载时,它们不会获取新数据 - 您无法擦除缓存中已加载的内容。

      编辑:还想在阅读其他 cmets 后添加一些内容:您可以告诉浏览器不要缓存任何数据,这将要求他们重新加载所有内容,即使他们按下后退按钮也是如此,但您还需要他们重新加载所有内容,即使它们已通过身份验证 - 这是您必须忍受的权衡。这显然取决于您网站的特定情况——但在大多数情况下,我认为这不是一个值得的权衡。您的托管将需要更多带宽,因为每次页面加载时都会重新下载资源,页面加载时间会更长,因为浏览器不能依赖其本地缓存,因此您的应用程序自然会在用户看来更慢。只要不是绝对必要除非他们主动登录才能看到数据,我会找到一种礼貌且不引人注目的方式来告诉您的用户注销并关闭浏览器窗口,以减少窥探的可能性眼睛看到了他们不应该看到的数据。

      【讨论】:

        【解决方案4】:

        使用$_GET,但不验证任何形式$_SESSION

        试试这个

        session_start ();
        if (isset ( $_GET ['req'] ) && $_GET ['req'] == 'logout') {
            $_SESSION ['auth'] = false ;
            session_destroy ();
        }
        
        if (! isset ( $_SESSION ['auth'] ) || $_SESSION ['auth'] == false) {
            header ( "Location: index.php" );
            exit ();
        }
        

        确保您的主页中有类似的内容

        session_start ();
        
        if(/** login Condition **/)
        {
            $_SESSION ['auth'] = true ;
        }
        
        if (! isset ( $_SESSION ['auth'] ) || $_SESSION ['auth'] == false) {
            header ( "Location: index.php" );
            exit ();
        }
        

        谢谢

        :)

        【讨论】:

          【解决方案5】:

          这是一种简单快捷的解决方案。在登录表单标签中添加 target="_blank",它会在不同的窗口中显示内容。然后在注销后只需关闭该窗口并解决后退按钮问题(Safari 浏览器)。即使尝试使用历史记录也不会显示该页面,而是重定向到登录页面。这对于 Safari 浏览器很好,但对于 Firefox 等其他浏览器, session_destroy();照顾它。

          【讨论】:

            【解决方案6】:
            <?
            session_start();
            if(!isset($_SESSION['username']) && !isset($_SESSION['password'])){
            header("Location:../index.php");
            exit;
            }
            else{
            session_destroy();
            }
            ?>
            

            将此粘贴​​到每个页面或您的注销位置

            <?php
            session_start();
            session_unset();
            session_destroy();
            header("Location:../index.php");
            exit;
            

            user_logout.php

            【讨论】:

              【解决方案7】:

              将此添加到您的代码中,它将阻止用户单击返回按钮。

                   ignore_user_abort(true);
              

              【讨论】:

              • 不,它不会... ignore_user_abort() 设置客户端断开连接是否会导致脚本中止。
              猜你喜欢
              • 2011-10-02
              • 1970-01-01
              • 2023-02-21
              • 1970-01-01
              • 2012-04-15
              • 1970-01-01
              • 1970-01-01
              • 2012-05-17
              • 2023-04-02
              相关资源
              最近更新 更多