在子域和域之间共享cookie

问题描述 投票:331回答:5

我有两个问题。我理解,如果我在cookie中将域指定为.mydomain.com(带有前导点),则所有子域都可以共享cookie。

subdomain.mydomain.com可以访问在mydomain.com创建的cookie(没有www子域)吗?

如果在mydomain.com中创建,www(没有subdomain.mydomain.com子域)可以访问cookie吗?

http cookies subdomain
5个回答
539
投票

如果域名在mydomain.com标题中明确命名,则2个域subdomain.mydomain.comSet-Cookie只能共享cookie。否则,cookie的范围仅限于请求主机。 (这被称为“仅限主机的cookie”。请参阅What is a host only cookie?

例如,如果您从subdomain.mydomain.com发送以下标头:

Set-Cookie: name=value

然后,cookie将不会发送给mydomain.com的请求。但是,如果您使用以下内容,它将在两个域上都可用:

Set-Cookie: name=value; domain=mydomain.com

RFC 2109中,没有前导点的域意味着它不能在子域上使用,只有一个前导点(.mydomain.com)允许它跨多个子域使用(但不是顶级域,所以你问的是在较旧的规范中不可能)。

但是,所有现代浏览器都遵循较新的规范RFC 6265,并且会忽略任何前导点,这意味着您可以在子域以及顶级域上使用cookie。

总之,如果你像mydomain.com那样设置一个类似上面第二个例子的cookie,那么subdomain.mydomain.com就可以访问它,反之亦然。这也可用于允许sub1.mydomain.comsub2.mydomain.com共享cookie。

也可以看看:


25
投票

我不确定@cmbuckley的回答是否显示全貌。我读到的是:

除非cookie的属性另有说明,否则cookie仅返回到源服务器(而不是例如,返回到任何子域),并且它在当前会话结束时(由用户代理定义)到期。用户代理忽略无法识别的cookie。

RFC 6265

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

对我而言,这意味着您可以保护cookie不被子域/域读取,但不能阻止将cookie写入其他域。因此,有人可能会通过控制同一浏览器访问的另一个子域来重写您的站点cookie。这可能不是一个大问题。

@cmbuckley提供的令人敬畏的cookie测试网站/那些像我一样错过了它的答案;值得滚动和upvoting /:


16
投票

以下是使用DOM cookie API(https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie)的示例,因此我们可以自己查看行为。

如果我们执行以下JavaScript:

document.cookie =“key = value”

它似乎与执行相同:

document.cookie =“key = value; domain = mydomain.com”

cookie密钥在域mydomain.com上可用(仅)。


现在,如果您在mydomain.com上执行以下JavaScript:

document.cookie =“key = value; domain = .mydomain.com”

cookie密钥可用于mydomain.com以及subdomain.mydomain.com。


最后,如果您尝试在subdomain.mydomain.com上执行以下操作:

document.cookie =“key = value; domain = .mydomain.com”

cookie密钥是否可用于subdomain.mydomain.com?我有点惊讶这是允许的;我曾认为,如果子域能够在父域上设置cookie,则会违反安全规则。


3
投票

在这两种情况下都可以,这是IE和Edge的默认行为。

其他答案增加了有价值的见解,但主要描述了Chrome中的行为。重要的是要注意IE中的行为完全不同。 CMBuckley非常有用的测试脚本演示了在(比方说)Chrome中,当没有指定域时,cookie和子域之间不共享cookie。然而,IE中的相同测试表明它们是共享的。这个IE案例更接近CMBuckley的www-or-not-www链接中的带回家描述。我知道这是因为我们有一个系统在根和子域上使用不同的servicestack cookie。这一切都运行良好,直到有人在IE中访问它并且两个系统争夺其会话cookie将赢得直到我们炸毁缓存。


-6
投票

简单解决方案

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);

Setcookie的第5个参数确定cookie可用的(子)域。将其设置为(EXAMPLE.COM)使其可用于任何子域(例如:SUBDOMAIN.EXAMPLE.COM)

参考:http://php.net/manual/en/function.setcookie.php

© www.soinside.com 2019 - 2024. All rights reserved.