【问题标题】:How to destroy the session cookie correctly with PHP?(PHP) 如何正确销毁会话 cookie?
【发布时间】:2011-01-15 13:17:10
【问题描述】:

我正在尝试正确注销管理员用户。这是我的功能:

function logout()
{
    $_SESSION = array(); //destroy all of the session variables
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }
    session_destroy();
}

基本上,一旦我验证了密码,我就会将会话设置为有效(总共只有 1 个用户)。现在,当管理员点击注销时,我想销毁当前会话,并销毁 cookie,这样他们就不能只使用浏览器中存储的会话 cookie 回到管理页面。但我的代码不起作用。我点击注销,我可以直接导航回管理页面。但是,如果我删除了我的 cookie,则该功能是完美的。那么这里的cookie删除功能有什么问题呢?

【问题讨论】:

    标签: php cookies session


    【解决方案1】:

    也许您的问题不是 cookie,而是浏览器显示您的管理页面的缓存版本。可以吗?如果按 F5 时它消失了,可能就是这样。这可以通过设置正确的cache-control headers来排序。

    查看this SO question 关于如何设置缓存的问题。问题正好相反(强制浏览器缓存),但您会弄清楚要更改什么来关闭缓存。

    【讨论】:

    • 好的,有道理,但是为什么我销毁会话后仍然可以直接访问管理页面??
    • 没关系,我想我明白了——我没有在我的注销页面上调用 session_start()(注销文本链接到调用我上述函数的注销页面)
    • 删除 cookie 仍然是明智之举,以便通过 Varnish 等缓存提高匿名内容的可缓存性。如果浏览器不断发送 cookie,即使您为每个访问者生成完全相同的响应,Varnish 也不会缓存响应。
    • OP 的基本概念没有缺陷。他展示了结束登录会话的教科书方法,如 PHP 手册中所述。
    • @Nilpo 确实!编辑了那一点。
    【解决方案2】:

    如果您真的想涵盖所有基础,请尝试这样做:

    setcookie (session_id(), "", time() - 3600);
    session_destroy();
    session_write_close();
    

    这应该防止在 PHP 执行的其余部分进一步访问会话数据。浏览器可能仍会显示正在设置的 cookie,但 $_SESSION super 将为空白

    【讨论】:

    • 我认为你应该在第一行写session_name()(等于PHPSESSID)。
    【解决方案3】:

    对于在会话 cookie 过期时遇到问题的其他人的提示:

    PHP - why can't I get rid of this session id cookie?

    始终使用 session_get_cookie_params() ,就像上面链接中问题的答案一样。

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 2016-09-17
      • 2012-05-25
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多