【问题标题】:Why is the session not expiring on browser close when session.cookie_lifetime=0?当 session.cookie_lifetime=0 时,为什么会话不会在浏览器关闭时过期?
【发布时间】:2012-01-21 01:01:06
【问题描述】:

我建立了一个 PHP 编码网站的测试版本,它使用会话来处理用户登录。在测试服务器上,会话将在浏览器关闭时过期,因为将所有内容复制到“干净”的实时服务器,会话在浏览器关闭时保持原位,即使在系统完全重启后的第二天用户仍然登录。

在 php.ini 中

; cookie 的生命周期(以秒为单位),如果为 0,则直到重新启动浏览器。 ; http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime session.cookie_lifetime = 0

这意味着它应该在浏览器重新启动时过期。

我认为它可能在某处被覆盖,但如果我 print_r PHP 中的 session_get_cookie_params 我得到

Array
(
    [lifetime] => 0
    [path] => /
    [domain] => 
    [secure] => 
    [httponly] => 
)

我有什么遗漏吗?

【问题讨论】:

  • 你在其他浏览器上试过了吗?你使用的是什么浏览器?到期值可能会发送到浏览器,但浏览器可能会拒绝在关闭时删除 cookie。检查您的浏览器设置并在其他浏览器上进行测试。
  • 在 Firefox 和 IE 中是一样的。当然,如果是浏览器问题,测试服务器上也会发生与实时服务器相同的情况。这种行为不会发生在其他网站上(无论如何我都注意到了)
  • 此外,该网站是为谁建造的客户已经注意到并且他不希望它发生!

标签: apache session php


【解决方案1】:

如果您使用的是谷歌浏览器

如果您设置“从上次中断的地方继续”,chrome 将恢复您的浏览数据和会话 cookie。

甚至 Facebook 登录(没有“记住我”)会话也被保留。

更多信息

google chrome setting

【讨论】:

    【解决方案2】:

    这里的问题是 Firefox 有一个名为“恢复上次会话”的功能。如果有人在关闭时使用保存标签,那么它是一样的。当浏览器恢复上一个会话时,所有会话 cookie 也将恢复:)

    因此您的会话 cookie 可以永远存在。你可以在Firefox session cookies阅读更多内容

    【讨论】:

    • 这并不能解释为什么它只在实时服务器而不是测试服务器上显示这种行为,或者为什么 IE 显示相同的行为。另外,关闭 FF 时,我没有保存标签,也没有恢复上一个会话。
    • 仍然有用,谢谢。在 FF tbh 中似乎有点安全风险。
    • 更好的身份验证解决方案是使用具有固定生命周期的cookie并在每次请求时“触摸”它。
    • 在FF中不会有同样的问题吗?另外,如果我将其设置为 10 分钟,如果用户关闭了浏览器而其他人在到期时间内重新打开了它,那么他们仍然会登录。
    【解决方案3】:

    我打算将此添加为对亚历山大出色答案的评论,但它会变得有点冗长。

    cookie 在浏览器上保留多长时间和服务器在没有请求的情况下保留会话数据多长时间是两个独立的事情。由于 HTTP 的无状态特性,无法避免这种情况 - 尽管您可以采取一些措施来缓解您认为的安全漏洞。

    为了让浏览器在关闭和延迟后访问同一个会话,它需要浏览器保留会话 cookie(Alexander 已经解释过) 让服务器拥有保留会话数据。

    您描述的行为在处理少量请求并且会话处理程序不验证会话数据的 TTL 的系统上可能更加明显(我不确定默认处理程序是否这样做,或者它们是否只是假设任何未删除的会话数据都被认为是当前的)。

    您尚未提供有关如何配置 2 个服务器的任何详细信息,尤其是 session.gc_maxlifetime。

    如果 session.gc_maxlifetime 在请求之间已过期但会话数据仍然可以访问,这意味着会话处理程序仅将此视为会话被认为有资格进行垃圾收集的时间(从语义上讲,这就是配置选项用于)。但是,有充分的理由将此值视为 TTL。要解决这个问题,您可以强制垃圾收集更频繁地运行并删除会话数据,或者使用忽略早于指定限制的会话数据的会话处理程序。

    您看到两个系统之间的差异可能是由于 session.gc_maxlifetime 的值不同或垃圾收集频率的差异,甚至是不同的会话处理程序。

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2016-12-13
      • 2018-06-19
      • 2013-11-17
      • 2015-08-12
      • 1970-01-01
      相关资源
      最近更新 更多