【问题标题】:Clearing session cookies in the browser清除浏览器中的会话 cookie
【发布时间】:2014-04-04 07:39:15
【问题描述】:

我需要对会话和会话 cookie 逻辑进行一些确认。

当您在浏览器中手动关闭浏览器/删除会话 cookie 时会发生什么(顺便说一句,默认情况下它们是否具有相同的结果?)?

在给定的情况下,会话 cookie 的删除发生在客户端。
浏览器是否向 Web 服务器(即 Apache)发送隐式消息,说当前 session_id 应该被销毁并且可以重新使用?或者 Web 服务器是否有一种机制来重新使用长时间处于非活动状态的 session_id?

产生的问题:
在第二种情况下,如果会话被客户端销毁,PHP 如何知道何时从 PHP 文件系统 (tmp) 中清除当前的 $_SESSION 全局变量? Apache 是否在重新使用 session_id 之前向 PHP 发送命令以删除带有会话信息的相应文件?这些会话文件是否会保留在那里直到某个到期时间(或者当会话 cookie 被销毁时它们真的会立即被销毁)?

您可能已经注意到,我在这里遇到了一些困惑。
谢谢你帮我澄清。

编辑:
我说的是这些会话 cookie:

【问题讨论】:

    标签: php session session-cookies


    【解决方案1】:

    有两种类型的 cookie:

    1) Server side cookie
    2) Client (HTTP) side cookie
    

    当您从浏览器中清除 cookie 时,它​​只会清除客户端 cookie(您机器上的 cookie)。是的,所有 cookie 都设置了过期时间。

    一些信息给你:

    客户端 cookie

    Cookie 是网站用来在浏览器上存储状态信息的键/值对。假设您有一个网站(example.com),当浏览器请求一个网页时,该网站可以发送 cookie 以在浏览器上存储信息。

    浏览器请求示例:

    GET /index.html HTTP/1.1 主机:www.example.com 来自服务器的示例答案:

    HTTP/1.1 200 OK
    Content-type: text/html
    Set-Cookie: foo=10
    Set-Cookie: bar=20; Expires=Fri, 30 Sep 2011 11:48:00 GMT
    ... rest  of the response
    

    这里有两个 cookie foo=10 和 bar=20 存储在浏览器上。第二个将于 9 月 30 日到期。在每个后续请求中,浏览器都会将 cookie 发送回服务器。

    GET /spec.html HTTP/1.1
    Host: www.example.com
    Cookie: foo=10; bar=20
    Accept: */*
    SESSIONS: Server side cookies
    

    服务器端 cookie 称为“会话”。在这种情况下,网站在浏览器上存储一个包含唯一会话标识符的 cookie。状态信息(上面的 foo=10 和 bar=20)存储在服务器上,会话标识符用于将请求与存储在服务器上的数据进行匹配。

    点击此处了解更多详情:

    What is the difference between server side cookie and client side cookie?

    When session cookies are cleared, they are removed from the client (your machine). Now, the server can't identify you since it doesn't know the session id which was in the cookie you cleared recently, and so it looks like your session is cleared.
    

    部分功劳归于回答该问题的人!!

    【讨论】:

    • 清除会话 cookie 后,它们将从客户端(您的计算机)中删除。现在,服务器无法识别您,因为它不知道您最近清除的 cookie 中的会话 ID,因此看起来您的会话已被清除。
    • 正如我所说,当您从浏览器中清除 cookie 时,客户端 cookie 会被删除。但是服务器上的 SESSION 信息仍然存在。一般来说,服务器上的 SESSION 要么保存在文件、数据库等中。当它们被清除时,服务器端的 SESSION 也会被清除。
    • 据我了解,会话 ID 由 Web 服务器(即 Apache 的内存 - db)生成并存储在其中,而会话变量默认存储在 PHP tmp 文件夹中。我的理解是,当会话cookie(带有会话ID)在浏览器中被删除时,客户端无法在服务器上被识别。所以之前的会话 id 需要过期,但是 Web 服务器还不知道,PHP 全局变量仍然被存储。这就是我感到困惑的地方:它们是如何被销毁的(网络服务器 session_id + PHP 会话全局变量)。
    • 例如;我可以理解 Web 服务器是否使未使用的 session_id 过期(15 分钟)并向 PHP 引擎发送命令以销毁全局变量。但我不知道这是不是真的。
    • 第一点,PHP 不是 Web 服务器,它不直接处理会话。它仅有助于 Web 服务器处理会话。
    【解决方案2】:

    如果您从浏览器中删除会话数据,则没有反馈给服务器以销毁给定会话。

    会话在一段时间后被销毁,会话生命周期。 AFAIK 设置为 15 分钟。

    【讨论】:

    • 谢谢。 Web 服务器是否向 PHP 发送命令以销毁会话文件,关联它要销毁的 session_id,或者 PHP 是否向 Web 服务器发送命令,说它将销毁会话变量并请求删除(重新使用) session_id。
    • 您可能应该将 PHP 视为网络服务器,因为 PHP 正在维护会话、销毁会话、重用会话。我不知道 PHP 中更新服务器会话的机制,我认为在你的情况下它也不重要,因为在你的场景中,网络服务器自己处理会话。您可能会在这里找到更深入的解释:php.net/manual/en/book.session.php。可能相关en.wikipedia.org/wiki/Session_hijacking
    • 谢谢,我会检查的。
    • 糟糕,我不小心在我的智能手机上投了反对票 - 我会尽快纠正这个问题,然后删除这条评论。 (显然你需要先编辑这个答案,然后我才能重新投票)。
    • 比如,你清理了服务器cookie,那么即使客户端有cookie,它们也不会有效,因此没有价值。当您清理客户端 cookie 时,您将无法“交叉”具有相同 id 的服务器 cookie。但如果您能以某种方式再次获取客户端 cookie,您将检查它们是否仍在工作。因此,无效的服务器 cookie 将根据您对 cookie 的使用禁用客户端。
    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2014-02-21
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多