【发布时间】:2011-12-21 07:45:50
【问题描述】:
当存在多个对当前域有效的具有相同名称和路径的 cookie 时,我对各种浏览器的行为感兴趣。例如。浏览器存储了这两个 cookie:
key=value; path=/; domain=foo.bar.baz
key=value; path=/; domain=bar.baz
当用户访问foo.bar.baz时,Cookie header的内容是什么?
RFC 2965 对这个问题有这样的看法:
如果多个 cookie 满足上述条件,它们将按顺序排列 Cookie 标头,以便具有更具体 Path 属性的那些 在那些不太具体的人之前。相对于其他订购 属性(例如,域)未指定。
(这是 IMO 一个非常奇怪的设计选择,但这就是我们所拥有的)。我想服务器端框架使用第一个值,因为它至少有时更具体(我检查了 PHP,它确实这样做了)。
我想知道主要浏览器的行为:他们会先发送哪个 cookie? (换句话说,我在多大程度上可以依赖我的应用程序获得“正确”、更具体的值?)
【问题讨论】:
-
我认为,无论目前任何浏览器的行为如何,您都不能依赖这样的经验性答案,因为标准说“未指定”并且任何浏览器/任何版本都可以随时更改此行为。 ..
-
这不是真正的依赖,更多的是防御它......这可能导致同一父域上的两个站点以不可预知的方式改变彼此的行为。 (实际上我就是这样发现的,两个网站都使用了 PHPSESSID cookie,人们莫名其妙地退出了。)
-
不确定我是否理解...您想根据经验答案来防御“未定义行为”(标准方面),一旦有了新的浏览器补丁或版本,该答案可能会过时/不完整过来 ?您将如何防御这种情况以及如何使防御保持最新状态?
-
对我的 POV 最简单的防御是不在主域
bar.baz上使用 PHPSESSID - 其余的都可以正常工作,因为根据标准没有“回退”,因此 cookie 保留在其上自己的子域...也许甚至在子域上运行了一些配置错误的 PHP 脚本,这些脚本在主域上显式设置了它们的 cookie? -
尝试使用 Firefox 插件 YSlow (Yahoo Slow) 学习有趣的 cmets,其中有大量建议,其中一个应该回答您的问题(查找“静态域名”)。跨度>
标签: cookies