当有多个具有相同名称和路径的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? (换句话说,我可以依靠我的应用程序获得"正确",更具体的价值?)
答案 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 - 这样就可以避免整个问题,无论子域名/浏览器版本等如何。