2011-11-03 95 views
2

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

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

会是怎样的Cookie头当用户访问foo.bar.baz的内容?

RFC 2965有此说关于这个问题:

如果多个cookie满足以上,他们在 是有序的Cookie头,使得那些有更具体的路径属性 先于那些不太具体的标准。关于其他 属性(例如,域)的排序未指定。

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

我想知道的是主要浏览器的行为:他们首先发送哪个cookie? (换句话说,有多少我可以靠我的申请得到了“正确”的,更具体的价值?)

+0

我认为,不管目前的任何浏览器的行为,你都不能依赖这样的自sta以来的一个经验回答ndard说“未指定”,任何浏览器/任何版本都可以随时改变这种行为... – Yahia

+0

这不是真正的依赖,更多的是为了防御它......这可能会导致同一父域中的两个站点改变彼此的行为不可预知的方式。 (这就是我发现它的实际情况,两个网站都使用了PHPSESSID cookie,并且人们被莫名其妙地注销了。) – Tgr

+0

不确定我明白...你想基于一个经验丰富的答案来防御“未定义的行为”(基于标准),只要一个新的浏览器补丁或版本出现,它就会过时/不完整。你将如何防守,你将如何保持你的防守up2date? – Yahia

回答

4

按上述意见:

对这个显然是“不确定的行为,最简单的防守(标准 - 明智)“从我的POV是不使用PHPSESSID在主域bar.baz,而是在www.bar.baz - 而不是在www.bar.baz - 子域将工作正常,因为根据标准没有”后备“在这种情况下,所以cookie停留在自己的子域。需要

一个可能的问题进行检查:
子域上运行

PHP脚本可以明确地被配置为设置的Cookie在主域......如果是这样的情况下(代码类似于ini_set('session.cookie_domain', 'bar.baz');)那么您需要将此配置更改为“标准”(通过删除显示的代码),这意味着子域上的脚本应该只在其自己的子域上设置Cookie。

编辑 - 按评论:

如果您还没有对其他一些子域名的任何控制,则“终极防御”是您PHPSESSID饼干重命名为真正独特的(像一个GUID以PHPSESSID作为前缀)或者由calling session_name() BEFORE session_start()或者由setting it in the config - 这种方式你规避了整个问题,无论子域/浏览器版本等。

+0

问题是,即使我确定cookie始终设置在“www.bar.baz”(我无论如何,在bar.baz上设置Cookie都会有一些缺点,从增加的图像/脚本请求大小到会话劫持漏洞),'someothersite.bar.baz'上的脚本(可能维护得不好,或者不受我控制)仍然可能会干扰我的登录过程。我想知道这样的问题可能会有多广泛。 – Tgr

+0

@Tgr我解决了这个问题......请参阅我的EDIT,以获得独立于浏览器/版本的解决方案,并且可以以一种甚至行为不当的子域不会为您的子域创建问题的方式实现... HTH – Yahia

+0

更改会话cookie的名称当然是一个好主意,但是有很多cookie可能会发生冲突,有些Cookie使用固定名称(例如Google Analytics跟踪cookie)。我想知道的是浏览器的百分比是否会成为问题。 – Tgr

相关问题