在子域和域之间共享cookie

ada*_*101 368 cookies subdomain http

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

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

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

cmb*_*ley 582

2个域mydomain.com,subdomain.mydomain.com如果在Set-Cookie标头中明确命名域,则只能共享cookie .否则,cookie的范围仅限于请求主机.(这被称为"仅限主机的cookie".请参阅什么是仅限主机的cookie?)

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

Set-Cookie: name=value
Run Code Online (Sandbox Code Playgroud)

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

Set-Cookie: name=value; domain=mydomain.com
Run Code Online (Sandbox Code Playgroud)

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

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

总之,如果你设置一个像上面第二个例子那样的cookie .mydomain.com,它就可以被访问mydomain.com,反之亦然.

也可以看看:

  • 在旧标准中,带有`domain = .mydomain.com`的cookie对于裸mydomain.com无效,因此这两个RFC彼此不兼容. (12认同)
  • 我不知道该把它放在哪里,所以我选择已接受答案的评论。在我的本地主机上证明上述内容花了很长时间且失败的实验,直到我想到我应该在名称中使用点来调用本地主机。像“localhost.com”或类似的东西。然后,所有“设置cookie”行为都按照本答案中所写的解释开始。希望这可以帮助某人。 (7认同)
  • @Frank,是的,我知道.我的评论是澄清我的问题是关于在域和子域之间共享cookie,而不是在两个子域之间. (4认同)
  • 谢谢; 我添加了关于点的重要性的注释. (3认同)
  • 我不明白你为什么不把领导"." 在域上与新旧兼容性最大化 (2认同)
  • @shi 是的 - 请参阅最后一句:“这也可用于允许 `sub1.mydomain.com` 和 `sub2.mydomain.com` 共享 cookie。” (2认同)
  • 将其称为“安全配置错误”并不是一个好主意。Cookie,特别是包含敏感数据的 Cookie,理想情况下应将范围限制在最严格的适当域/路径限制范围内。跨越整个领域的范围可能是一个坏主意,尤其是对于一个庞大的庄园来说,但这也可能是必要的。强调风险很重要,并且重新架构以防止出现任何问题可能是个好主意,但将其称为错误配置是不公平的。 (2认同)

Acc*_*t م 58

请大家注意,您可以从域上的子域设置 cookie。

(在请求的响应中发送subdomain.mydomain.com

Set-Cookie: name=value; Domain=mydomain.com // GOOD
Run Code Online (Sandbox Code Playgroud)

但是您不能从子域上的域中设置 cookie。

(在请求的响应中发送mydomain.com

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie
Run Code Online (Sandbox Code Playgroud)

为什么 ?

根据规范RFC 6265第5.3.6节存储模型

如果规范化的请求主机域属性不匹配:完全忽略 cookie 并中止这些步骤。

RFC 6265 第 5.1.3 节域匹配

域匹配

如果至少满足以下条件之一,则字符串域匹配给定的域字符串:

  1. 域字符串和字符串是相同的。(请注意,此时域字符串和字符串都将被规范化为小写。)

  2. 以下所有条件都成立:

    • 域字符串是字符串的后缀。

    • 未包含在域字符串中的字符串的最后一个字符是 %x2E (".") 字符。

    • 该字符串是主机名(即,不是 IP 地址)。

所以“subdomain.mydomain.com”域匹配“mydomain.com”,但“mydomain.com”不域匹配“subdomain.mydomain.com”

也检查这个答案

  • 这是对我最有帮助的答案。 (6认同)
  • 感谢您提供*已记录的*答案,该答案为 RFC 参考文献准确解释了浏览器何时应该接受 cookie 域,以及为什么“foo.domain.com”可以为“domain.com”设置 cookie,尽管似乎这会违反“同源政策”,并可能被视为安全风险。 (2认同)
  • 值得指出的是,您可以在任何超级域(但不包括 TLD)上设置 cookie。例如,您不能使用“domain=com”。这是相当明显的,但有一个不能使用的域列表:https://publicsuffix.org (2认同)

ako*_*nov 29

我不确定@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.
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这看起来与我所说的一致:除非你指定`domain`,否则cookie仅用于请求主机.这意味着来自`mydomain.com`的`Set-Cookie:name = value`将不会与子域的请求一起发送.也可以玩[这个测试脚本](http://scripts.cmbuckley.co.uk/cookies.php). (4认同)
  • 感谢您的 cmbuckley 链接。很高兴能够快速测试它的工作原理。 (2认同)
  • 再次点赞指出测试地点。 (2认同)

lla*_*bda 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,则会违反安全规则.

  • 这让我想知道是否有单独的规范描述“httponly”cookie 与您正在创建的 cookie 类型的行为。 (2认同)
  • 您发布的文档与您的陈述不符。前两个示例是“不等同”的(domain属性会导致Cookie在子域上工作;没有此类属性则不行)。最好不要忽略前导点,最坏的情况下会主动阻塞。 (2认同)

Ale*_*122 7

如果您在本地主机上工作,请小心!如果你像这样在 JavaScript 中存储 cookie:

document.cookie = "key=value;domain=localhost"
Run Code Online (Sandbox Code Playgroud)

您的子域可能无法访问它,例如sub.localhost. 为了解决这个问题,您需要使用VirtualHost。例如,您可以使用 配置您的虚拟主机ServerName localhost.com,然后您将能够将 cookie 存储在您的域和子域上,如下所示:

document.cookie = "key=value;domain=localhost.com"
Run Code Online (Sandbox Code Playgroud)