我设置了一个PHP编码网站的测试版本,它使用会话来处理用户登录。在测试服务器上,会话将在浏览器关闭时到期,因为将所有内容复制到“干净”的实时服务器,会话在浏览器关闭时保持不变,即使在完全系统重新启动后的第二天,用户仍然登录。
在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
这意味着它应该在浏览器重启时到期。
我想也许它被覆盖了某个地方,但是如果我在PHP中打印session_get_cookie_params我得到了
Array
(
[lifetime] => 0
[path] => /
[domain] =>
[secure] =>
[httponly] =>
)
我有什么遗失的吗?
答案 0 :(得分:8)
如果您使用的是谷歌浏览器
如果您设置“继续我离开的地方”,Chrome将恢复您的浏览数据和会话Cookie。
即使Facebook登录(没有“记住我”)会话也会被保留。
了解更多信息
答案 1 :(得分:4)
问题在于Firefox有一个名为“恢复上次会话”的功能。如果有人在关闭时使用保存标签,则它是相同的。当浏览器恢复上一个会话时,所有会话cookie也将被恢复:)
因此,您的会话cookie可以永久存在。您可以在Firefox session cookies
了解更多信息答案 2 :(得分:3)
我打算将此作为对亚历山大的优秀答案的评论,但它会变得有点冗长。
在浏览器中保留cookie的时间以及服务器在没有请求的情况下保留会话数据的时间是2个单独且独立的事情。由于HTTP的无状态特性,无法避免这种情况 - 尽管您可以采取一些措施来缓解您认为的安全漏洞。
为了让浏览器在关闭后访问同一会话并且有一些延迟,它要求浏览器保留会话cookie(Alexander已经解释过)和供服务器使用保留了会话数据。
您描述的行为在处理少量请求的系统上可能会更加明显,并且会话处理程序不会验证sesion数据的TTL(我不确定默认处理程序是否执行,或者它们是否只是假设任何未删除的会话数据被认为是当前的)。
您没有提供有关如何配置2台服务器的任何详细信息,尤其是session.gc_maxlifetime。
如果session.gc_maxlifetime在请求之间已经过期但会话数据仍然可访问,则这意味着会话处理程序仅将此视为会话被认为有资格进行垃圾收集的时间(从语义上讲,这是配置选项是)。然而,有一个强有力的理由将此值视为TTL。要解决此问题,您可以强制垃圾收集更频繁地运行并删除会话数据,或使用会话处理程序忽略超过指定限制的会话数据。
您认为两个系统之间的差异可能是由于session.gc_maxlifetime的值不同或者垃圾收集频率的差异,甚至是不同的会话处理程序。