【问题标题】:session is not destroyed会话没有被破坏
【发布时间】:2011-09-19 14:58:46
【问题描述】:

我有这个文件

安全.php

session_start();
if(empty($_SESSION['u_name'])) {
    header("Location:emprego.php");
}

if(isset($_GET['logout'])) {
    session_destroy();
    header("Location:emprego.php");
}

$name = $_SESSION['u_name'];

?>

<li><?php echo "<a href='emprego.php?logout' id='D'>Logout</a>";?></li>

基本上,如果我注销,我将被重定向到 emprego.php。但是如果我点击后页按钮(浏览器中的箭头),我可以查看相同的页面(secure.php)。

我的问题是,为什么?

谢谢

【问题讨论】:

  • 您是否检查过您的 php.ini 以查看是否有会话自动启动?我想这是你的问题。
  • 您确定您查看的不是页面的缓存版本吗?此外,在任何重定向后使用 exit(),否则 PHP 会继续执行页面,如果您的浏览器不跟随位置标头,它将显示内容。
  • 登出后可以在页面上做任何事情吗?可能只是缓存错误,这意味着他们可以查看该页面,因为它是从本地历史记录中加载的。在这种情况下,他们应该无法从那里做任何事情,尝试更改页面会给您带来会话错误(假设您在允许用户执行操作之前检查会话)。
  • 后退页按钮我认为是指浏览器按钮。我认为您是从浏览器缓存而不是服务器获取页面。所以点击刷新看看你的会话是否有效。
  • 我清除了缓存但页面仍然打开

标签: php session logout


【解决方案1】:

所有其他解决方案似乎都不适合我。但是,这种解决方法起到了作用。基本上,下面的代码会一直调用注销,直到注销最终成功:

if (isset($_GET["logout"])){
    if (isset($_SESSION["username"])) {
        unset($_SESSION["username"]);
        session_destroy();
        header("Location:/?logout=true");
        exit;
    }
    header("Location:/");
    exit;
}

【讨论】:

    【解决方案2】:

    我最近发现header_remove();http://php.net/manual/en/function.header-remove.php

        Caution: This function will remove all headers set by PHP, including cookies, session and the X-Powered-By headers.
    

    不确定这是否是适当的方法,但它对于注销功能非常有效。

    【讨论】:

      【解决方案3】:

      http://nl2.php.net/manual/en/function.session-destroy.php

      在这里查看示例 1。它明确指出您还必须清除 $_SESSION。

      if(isset($_GET['logout'])) {
          unset($_SESSION['u_name']); //makes it non-existent (it does unset) that variable
          session_destroy();
          header("Location:emprego.php");
      }
      

      【讨论】:

        【解决方案4】:

        如果您正在使用会话 cookie,还请尝试明确地使会话 cookie 过期,如下所示:

        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() - 42000,
                $params["path"], $params["domain"],
                $params["secure"], $params["httponly"]
            );
        }
        

        此外,返回浏览器只会加载页面的缓存副本。如果您尝试与缓存页面交互以从服务器获取新页面,您应该无法继续。

        【讨论】:

          【解决方案5】:

          您的浏览器在缓存中保留了该页面的副本。当您单击后退按钮时,您看到的是本地缓存副本,而不是来自服务器的当前页面。如果您的安全设置正确,您将无法从该缓存页面执行任何有意义的操作。

          正是出于这个原因,安全网站(例如银行网站)会在您注销后告诉您注销并清除缓存(或关闭浏览器)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-11
            • 2013-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多