IE10默认情况下跨子域共享cookie

Mik*_*ith 19 php cookies internet-explorer web-applications

IE10似乎与其他主流浏览器(IE8,IE9,Firefox,Chrome,Safari)不同地处理cookie和子域.

我们广泛使用子域用于测试环境,例如:

  • user1.devel.example.com
  • user2.devel.example.com
  • qa.example.com

我们的生产环境居于顶端,例如example.com(技术上也是www.example.com).

我们setcookie($name, $value, $expires)天真地使用php 函数(没有指定显式路径或域)来设置cookie,然后通过为值分配空字符串来清除cookie(当用户注销时).这一直很好,每个独特的子域都使用自己的cookie.

IE10现在与所有子域"共享"在TLD中设置的cookie. 我们观察到的最初症状是没有人可以退出子域.我们观察了一些事情:

  • 即使它共享该值,也没有子域能够清除cookie.
  • 当TLD清除cookie时,它也会立即从所有子域中删除.

有没有其他人观察到IE10如何存储/应用相对于子域的cookie的类似行为?是否有任何解决方法,除了明确说明在发送初始Set-Cookie标头时cookie适用于哪个域?

sea*_*ght 16

我刚遇到这个问题.

以下是探索此错误/问题的人的链接: 包含和未指定域的Cookie(浏览器不一致)

这也可能是相关的: Cookie为子域设置,但IE Developer Tools在根域显示cookie.我错过了什么?

我的结论是,当从非www根域(http://sites.com)设置cookie时,在IE中,这被视为所有子域的通配符cookie.Chrome和Firefox不会显示此行为 - 它们将非www根域中的Cookie集关联为仅与该根关联.

我使用.net webforms,IIS和我的hosts文件编写了示例站点.我有3个站点:a.site.com,b.site.com和site.com.他们都提供了完全相同名称的cookie.我们称之为"ShoppingCart".

您可以在cookie上设置多个属性,包括cookie应与之关联的域.我将此属性保留为.net定义/未定义.当Chrome从每个网站收到Cookie时,它会将Cookie的域显示为明确来自浏览器地址栏中列出的域.在IE中,情况并非如此.IE将来自http://sites.com的cookie 视为".sites.com",根据RFC的Cookie,这意味着可以从所有子域访问它.

同样在IE中,如果使用相同的名称设置多个cookie,IE将按照它们设置的顺序将它们返回给服务器.因此,如果我首先访问http://sites.com然后访问http://a.sites.com然后刷新,IE 会将http://sites.com中的cookie视为有效的cookie发送到服务器这是http://a.sites.com的请求,它与http://a.sites.com的cookie一起发送,但http://sites.com的cookie 是列表中的第一个.

在.net中,根据我的看法,cookie通常是通过keyname访问的,而不是通过索引访问的.因此,当服务器端代码尝试访问名为"ShoppingCart"的密钥的值时,它将获取设置cookie值的第一个站点的值 - 这将是http://sites.com.

总而言之 - 当您拥有所有共享相同cookie密钥名称的子域时,请不要使用非www域,因为当Chrome/Firefox按预期处理域关联时,IE会导致错误行为.

编辑 -

只是为了澄清任何阅读此内容的人,我使用IE10来探索这个问题.