会话没有被破坏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了会话没有被破坏相关的知识,希望对你有一定的参考价值。

我有这个文件

secure.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)。

我的问题是,为什么?

谢谢

答案

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");
}
另一答案

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

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

另一答案

如果您正在使用会话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"]
    );
}

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

另一答案

我最近发现了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.

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

另一答案

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

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

以上是关于会话没有被破坏的主要内容,如果未能解决你的问题,请参考以下文章

当活动被破坏但我必须继续执行片段中的代码时该怎么办?

会话在 PHP 中突然被破坏

Laravel 会话突然被破坏

刷新后登录会话被破坏

被替换的片段不会被破坏

AJAX 调用在没有明显原因的情况下破坏会话