火狐浏览器会话cookie

114

通常情况下,如果没有设置过期时间的cookie会被现代浏览器视为“会话cookie”,也就是在浏览器会话结束时(通常是当浏览器实例关闭时)将删除该cookie。

IE、Opera、Safari和Chrome都支持此行为。

然而,Firefox(3.0.9最新正式版)似乎不遵循此规则,据我所知,它不会在浏览器关闭、用户注销或重新启动操作系统时过期cookie。

那么,为什么Firefox把这些cookie称为会话cookie,而它们却明显存在无限期?

有没有人知道Firefox如何处理会话cookie的过期?


1
我认为这个问题实际上还没有得到回答。我也看到了这个问题。 - bhollis
感谢BRH的研究,我确实看到了你的回复,本来想在标记答案之前检查一下你的研究,但完全忘记了!请原谅。 - meandmycode
8个回答

124

这显然是设计上的特点。请查看此Bugzilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=443354

Firefox有一个功能,当你关闭Firefox时,它会提示你保存所有标签,然后当你恢复浏览器时,这些标签就会回来。这被称为会话恢复。我没有意识到的是,它还会恢复这些页面的所有会话cookie!它把它当作你从未关闭过浏览器一样。

这在某种程度上是有道理的,因为如果你的浏览器崩溃了,你可以立即回到你之前的状态,但对于习惯于清除会话cookie的Web开发人员来说,这有点令人不安。我有一些旧的会话cookie,是几个月前由我始终打开的标签页设置的。

为了测试这个功能,请关闭浏览器中的所有标签页,然后关闭浏览器并重新启动。我认为在这种情况下,你网站的会话cookie应该会被清除。否则,你需要关闭会话恢复功能。


2
我认为这种行为相当值得质疑,感谢您的研究。如果选择“保存并退出”或“恢复选项卡和窗口”,在关闭浏览器时,所有会话cookie都保持不变。唯一的方法是让“用户”摆脱它们是先关闭选项卡,然后再关闭浏览器。 - mark
你有没有找到解决方法?我真的不想让Firefox挖掘旧会话,因为我需要应用程序中的会话ID是唯一的。 - ArjanP
6
我已经注意到这个(我认为不明智的)决定带来的一些影响:http://mrclay.org/index.php/2010/05/02/uh-oh-firefoxs-unique-session-cookie-behavior/ - Steve Clay
Chrome浏览器也是如此,它故意引入了一个可怕的安全漏洞,在过去的4年中没有人想要修复它。Chromium中的Chrome表示他们不会修复它。 - lucian303
http://www.w3.org/Protocols/rfc2109/rfc2109: Max-Age默认行为是在用户代理退出时丢弃cookie。 - lucian303
显示剩余4条评论

5

3

我不同意meandmycode的观点。

HTTP规范https://www.ietf.org/rfc/rfc6265.txt讨论了客户端如何处理带有过期时间的Set-Cookie头部:

如果服务器希望用户代理在多个“会话”(例如,用户代理重新启动)中保留Cookie,则服务器可以在Expires属性中指定过期日期。请注意,如果用户代理的Cookie存储超出其配额或用户手动删除服务器的Cookie,则用户代理可能会在到期日期之前删除Cookie。

这个逻辑的扩展是,服务器要求浏览器在退出时不维护Cookie的唯一方法是不设置Expires值(即会话Cookie)。如果浏览器不遵守这个语义,那么它就没有遵守服务器的响应。

实质上,用户代理决定忽略服务器请求,并表现得好像已经设置了一个Expires值。


3

这应该是可行的。我曾经是cookie模块测试人员之一,我认为没有任何设计原因会导致它的行为不同(尽管如果您崩溃,会话cookie可能被设计成在重新启动时继续存在...)

您是否在“首选项”菜单 > “隐私”选项卡 > “显示Cookie...”按钮中查看cookie?

另外,您尝试过新配置文件吗?


非常奇怪,如果这只是我测试过的两个系统中的一个错误,我会相对开心。我查看了Cookie并且它们可以存活任何事情...而且Firefox绝对将它们分类为会话Cookie...我在Firefox中更改的唯一选项是打开和关闭JavaScript...我的已安装插件是Firebug和Web Developer工具栏...啊好吧-无论如何,谢谢。 - meandmycode
还有各种不同的 cookie 模块偏好,但我记不清它们中有哪个具有这种功能。FF3 从文本文件转换为 cookie 数据库,也许您的数据库出现了错误。 - benc

1
我很困惑Mozilla已经将这个问题保留了几年。
好吧,所以我退出FF并关闭电脑。第二天FF开始并打开上一次的网页集(非常方便的功能),但是它恢复会话并重新登录到没有“保存我的设置”功能的站点。我知道因为它们是我建造的站点。无论我用php ini设置做什么,都会还原会话。
他们绝对不应该被恢复。页面可以,但是使用cookie ini设置为“0”的会话不可以。
我不明白为什么这不被标记为安全漏洞。当然,我可以在服务器端进行一些额外的检查,看看是否应该允许登录,基于最后登录时间,但这是不需要的。
会话不应该持久存在。FF正在操纵cookie到期设置。

依赖客户端删除cookie是一个“安全漏洞”。您必须始终确保在服务器端丢弃会话数据!这就像表单验证-永远不要相信客户端;-) - stollr

1

这在共享用户环境中是一个问题。如果我设置了一个认证cookie,它被设置为在会话结束时过期。在关闭浏览器并且另一个用户启动Firefox后,这将在Firefox中持续存在。Cookie之所以设置到期日期是有原因的!


1
说实话,关于“Cookie设置过期日期是有原因的”-在这种情况下,您没有设置过期日期,所以由浏览器决定该Cookie持续多长时间。 - meandmycode

1
在我的情况下,是因为固定选项卡会自动恢复会话,即使在Firefox设置中禁用了此选项。因此,如果取消固定选项卡,则不会恢复会话。

请在您的解决方案中包含一个示例或图解以详细说明! - Soumendra Mishra

-1

这让我感到不安。我的系统设置允许用户点击“退出”按钮,从而销毁所有会话cookie。但是,如果用户关闭浏览器而没有选择退出,我希望会话cookie被清除。

我实际上已经在Google Chrome、IE 9上进行了测试,效果很好。但是Firefox似乎不愿意删除这些“会话”(如Firebug所报告的)cookie。

好的。这就是我做的。我从FireFox主菜单中选择了“退出”,从那时起,一切都按预期进行了(不知道为什么)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接