【问题标题】:How can I not allow a user to go back after logout in PHP?在 PHP 中注销后如何不允许用户返回?
【发布时间】:2009-06-23 22:14:44
【问题描述】:

我刚刚写了一个PHP登录脚本,我想要完成的是当用户点击注销链接时,他们注销后,无论点击浏览器的后退按钮,他们都无法访问该页面.

这里是注销功能:

//Start the Session
session_start();
session_destroy();

header("location:login.php");
exit();

我确实在所有页面上都放置了以下代码,但这似乎不起作用:

header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT");    // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate");  // HTTP/1.1
header ("Pragma: no-cache");

//Start the Session
session_start();

有什么建议吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    您无法控制服务器上客户端后退按钮的工作方式。您可以在客户端使用 javascript 销毁历史数据。

    客户端可以完全忽略无缓存标头。

    【讨论】:

    • 是否应该设置一个javascript,在单击注销时将用户发送到logout.php?而不是仅仅建立一个链接 logout
    • 不要忘记客户端不需要启用javascript,所以不要依赖它。
    • 你是对的。那么如何防止用户在点击退出后点击浏览器后退按钮访问该网站?
    【解决方案2】:

    如果会话全局仍然设置为正确的值,请检查用户何时注销。

    print_r($_SESSION);
    

    这样做的原因是您正在执行 session_destroy 然后进行标头重定向,发生的情况是您强制重定向并且会话的销毁不是以这种方式写入服务器的。

    【讨论】:

    • Olafur,我想我快接近了。如果我没记错的话,最好将 $_SESSION 超全局设置为空,如下所示: $_SESSION = array();我仍然可以单击浏览器后退按钮并查看没有动态内容的页面。我想指出我的注销是一个 logout.php 的简单链接。我应该将注销设置为按钮表单而不是链接吗?看,当单击浏览器返回时,返回,不是重新发送要再次处理的页面。还有其他建议吗?
    • 你应该检查如果用户使用空会话变量访问站点,他应该通过 header() 重定向被抛出。
    • 问题是我没有将超全局 $_SESSION['logged'] 设置为空。所以检查 print_r($_SESSION);帮我定位问题。谢谢。
    【解决方案3】:

    我认为您需要在会话中存储一些内容,然后在每次页面加载时检查它。这是我过去的做法

    登录脚本(简体)

    session_start()
    // register necessary session variables
    $_SESSION['username'] = $username;
    

    注销脚本:

    session_start();
    
    // destroy the session and check to make sure it has been destroyed
    session_destroy();
        if(!session_is_registered('username')){
            $loginMessage = 'You have been logged out.';
            include 'index.php';
            exit();
        }
    
    // if we're still here, some bad juju happened
    

    每页的顶部

    session_start()
    
    // make sure user is logged in
    if (!$_SESSION['username']) {
        $loginError = "You are not logged in.";
        include("index.php");
        exit();
    }
    

    【讨论】:

      【解决方案4】:

      如果没有登录$_SESSION就重定向,例如:

      //on your protected pages
      session_start();
      if(!$_SESSION['logged']) {
          header("location:login.php");
      }
      

      这就是我的注销操作:

      session_start();
      // Unset all of the session variables.
      $_SESSION = array();
      // If it's desired to kill the session, also delete the session cookie.
      // Note: This will destroy the session, and not just the session data!
      if (isset($_COOKIE[session_name()])) {
          setcookie(session_name(), '', time()-42000, '/');
      }
      // Finally, destroy the session.
      session_destroy();
      

      【讨论】:

        【解决方案5】:

        我建议您将 HTTPS 与 SSL 一起使用。您可以关闭 SSL 会话并将用户踢回未加密的页面。

        大多数浏览器以不同的方式实现缓存方案。

        例如,在 Opera 中,您可以单击“返回”,它会直接从内存中提取页面数据,而不向服务器发送任何数据,即使页面已过期。当然,如果您点击刷新,您的服务器将需要登录。

        在 Internet Explorer 中,它的处理方式非常不同,表单数据会重新提交到服务器。

        【讨论】:

          【解决方案6】:

          可能是您的 session_destroy() 函数。试试这个:

          unset($_SESSION);
          

          取消设置 $_SESSION 变量将清除此处存储的所有内容。

          查看unset() on PHP.net

          【讨论】:

            【解决方案7】:
            $_SESSION['blah'] = '';
            

            这也有效..

            【讨论】:

            • Paul,是的,这会将会话变量设置为空。但是我遇到的问题是,当我单击浏览器后退按钮时,我仍然可以访问以前的成员页面。但是,显示的成员页面没有来自会话变量的动态内容。我想要完成的是,当点击注销时,用户即使点击浏览器后退按钮也无法访问该网站。
            【解决方案8】:
            <?
            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;
            

            破坏你的会话就这么简单

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-08
              • 2014-02-06
              • 2021-10-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多