2011-12-15 86 views
6

我设置了一个使用会话处理用户登录的PHP编码网站的测试版本。在测试服务器上,会话将在浏览器关闭时过期,因为将所有内容复制到“干净”活动服务器,会话在浏览器关闭时保持原位,用户在完全重新引导系统后的第二天仍然保持登录状态。session.cookie_lifetime = 0时,为什么会话在浏览器关闭时不会过期?

在php.ini

; Lifetime in seconds of cookie or, if 0, until browser is restarted. 
; http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime 
session.cookie_lifetime = 0

这意味着它应重新启动浏览器到期。

我想,也许它被覆盖的地方,但如果我的print_r的session_get_cookie_params在PHP中,我得到

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

有什么我失踪?

+0

你尝试在其他浏览器?你使用的是什么浏览器?到期值可能会发送到浏览器,但浏览器可能会拒绝在关闭时删除cookie。检查您的浏览器设置,并在其他浏览器上测试。 – mauris 2011-12-15 10:08:24

+0

在Firefox和IE中是一样的。当然,如果这是一个浏览器问题,测试服务器上也会出现这种情况。这种行为不会发生在其他网站上(我已经注意到了) – 2011-12-15 10:12:32

+0

此外,客户已经注意到网站是为其构建的,他不希望它发生! – 2011-12-15 10:13:30

回答

3

我要补充说,这个是亚历山大的出色答卷评论,但它会得到一个有点冗长。

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

为了让浏览器在关闭和延迟后访问同一会话,它要求浏览器(亚历山大已经解释过)保留会话cookie ,以便服务器保留会话数据。

您描述的行为可能在处理少量请求的系统上更明显,而会话处理程序不会验证sesion数据的TTL(我不确定默认处理程序是否执行,或者它们是否它们只是假定任何未删除的会话数据都被认为是最新的)。

你没有提供的2台服务器是如何配置的任何细节,尤其是的session.gc_maxlifetime。

如果session.gc_maxlifetime在请求之间已经过期,但会话数据仍然可以访问,这意味着会话处理程序仅仅认为这是会话被认为符合垃圾回收的时间(语义上,它是配置选项是)。但是,将这个值作为TTL来处理是有力的。要解决这个问题,您可以强制垃圾收集更频繁地运行并删除会话数据,也可以使用会话处理程序忽略超出指定限制的会话数据。

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

4

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

所以你的会话cookie可以长生不老。你可以阅读更多的Firefox session cookies

8

如果您正在使用谷歌浏览器

如果你设置“继续在那里我不放过”,Chrome将恢复您的浏览数据和会话Cookie。

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

更多信息

google chrome setting

相关问题