如何在子域和域之间共享cookie?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (5)
  • 关注 (0)
  • 查看 (925)

我有两个问题。 据我所知,如果我在cookie中指定域名为.mydomain.com(带有前导点),那么所有子域名都可以共享一个cookie。

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

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

提问于
用户回答回答于

2个域mydomain.comsubdomain.mydomain.com只能在Set-Cookie头中明确指定域的情况下共享Cookie。 否则,cookie的范围仅限于请求主机。 (这被称为“仅限主机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。

总之,如果像上面的第二个例子一样设置了一个cookie,那么mydomain.com,它可以通过subdomain.mydomain.com,反之亦然。

另见:

用户回答回答于

简单解

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

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

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

用户回答回答于

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

其他答案增加了有价值的见解,但主要描述了Chrome中的行为。 请注意,IE中的行为完全不同。 CMBuckley非常有帮助的测试脚本表明,在Chrome中,没有指定域时,Cookie不会在根和子域之间共享。 然而,IE中的相同测试显示它们是共享的。 这个IE案例更接近CMBuckley的www-or-www-link链接中的回家描述。 我知道这是因为我们有一个系统在根和子域上使用不同的服务堆栈cookie。 这一切都运行良好,直到有人在IE浏览器中访问它,并且两个系统通过会话cookie获胜,直到我们炸毁了缓存。

用户回答回答于

下面是一个使用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,那将是一种安全违规行为。

用户回答回答于

我不确定“cmackley”的答案是否显示了整个画面。我读到的是:

   Unless the cookie's attributes indicate otherwise, the cookie is
   returned only to the origin server (and not, for example, to any
   subdomains), and it expires at the end of the current session (as
   defined by the user agent).  User agents ignore unrecognized cookie
   attributes (but not the entire cookie).

还有

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.

扫码关注云+社区

领取腾讯云代金券