具有相同名称/路径的多个cookie的浏览器行为

时间:2011-11-03 15:51:57

标签: cookies

当有多个具有相同名称和路径的Cookie对当前域有效时,我对各种浏览器的行为感兴趣。例如。浏览器存储了这两个cookie:

key=value; path=/; domain=foo.bar.baz
key=value; path=/; domain=bar.baz

当用户访问Cookie时,foo.bar.baz标题的内容是什么?

RFC 2965有关于此问题的说法:

  

如果多个Cookie符合上述条件,则会订购      Cookie标头使那些具有更具体Path属性的标头      先于那些具体不太明确的人。与其他订购      属性(例如,域)未指定。

(这是IMO非常奇怪的设计选择,但这就是我们所拥有的)。我认为服务器端框架使用第一个值,因为至少有时更具体(我检查过PHP,确实是这样)。

我想知道的是主流浏览器的行为:他们首先发送哪个cookie? (换句话说,我可以依靠我的应用程序获得"正确",更具体的价值?)

1 个答案:

答案 0 :(得分:4)

根据上述评论:

对我的POV中明显的“未定义行为(标准明确)”的最简单防御是,不要在主域PHPSESSID上使用bar.baz,而是使用www.bar.baz - 子域名工作正常,因为根据标准,在这种情况下没有“后备”,因此cookie保留在自己的子域中。

需要检查一个可能的问题:

可以显式配置在子域上运行的PHP脚本以在主域上设置其cookie ...如果是这种情况(代码看起来类似于ini_set('session.cookie_domain', 'bar.baz');),则需要将此配置更改为“标准” “(通过删除显示的代码),这意味着子域上的脚本只应在自己的子域上设置cookie。

编辑 - 根据评论:

如果您对某些其他子域没有任何控制权,那么“终极防御”就是将您的PHPSESSID cookie重命名为真正独特的内容(如{{1}的GUID }}作为前缀)由calling session_name() BEFORE session_start()setting it in the config - 这样就可以避免整个问题,无论子域名/浏览器版本等如何。