434

由于我遇到了奇怪的域/子域 cookie 问题,我想知道浏览器如何处理 cookie。如果他们以不同的方式做到这一点,那么了解这些差异也会很高兴。

换句话说 - 当浏览器接收到一个 cookie 时,该 cookie 可能有一个域和一个附加到它的路径。或者不是,在这种情况下,浏览器可能会用一些默认值代替它们。问题1:它们是什么?

稍后,当浏览器即将发出请求时,它会检查其 cookie 并过滤掉它应该为该请求发送的那些。它通过将它们与请求路径和域进行匹配来实现。问题2:匹配规则是什么?


添加:

我问这个的原因是因为我对一些边缘情况感兴趣。喜欢:

  • cookie.example.com可以用于www.example.com吗?
  • cookie.example.com可以用于example.com吗?
  • cookieexample.com可以用于www.example.com吗?
  • cookieexample.com可以用于anotherexample.com吗?
  • www.example.com可以设置cookie吗example.com
  • www.example.com可以设置cookie吗www2.example.com
  • www.example.com可以设置cookie吗.com
  • 等等。

添加2:

另外,有人可以建议我应该如何设置一个cookie,以便:

  • 可以通过www.example.com或设置example.com
  • www.example.com和都可以访问它example.com
4

9 回答 9

410

尽管现在应该定义 cookie 的RFC 2965Set-Cookie2已经过时的RFC 2109),但大多数浏览器并不完全支持它,而只是遵守Netscape 的原始规范

Domain属性值和有效域是有区别的:前者取自Set-Cookie头域,后者是该属性值的解释。根据 RFC 2965,以下内容应适用:

  • 如果Set-Cookie头域没有Domain属性,则有效域为请求的域。
  • 如果存在Domain属性,则其值将用作有效域(如果该值不以 a 开头,.它将由客户端添加)。

拥有有效域,它还必须与当前请求的域匹配以进行设置;否则 cookie 将被修改。相同的规则适用于选择要在请求中发送的 cookie。


将这些知识映射到您的问题上,应适用以下内容:

  • Cookie withDomain=.example.com 可用于www.example.com
  • CookieDomain=.example.com 可用于example.com
  • CookieDomain=example.com将被转换为.example.com,因此可用于www.example.com
  • anotherexample.comDomain=example.com无法使用Cookie
  • www.example.com 能够为example.com设置 cookie
  • www.example.com无法www2.example.com设置 cookie
  • www.example.com无法.com设置 cookie

并为/通过www.example.comexample.com.www.example.com设置和读取 cookie,分别为和设置它.example.com。但是第一个 ( .www.example.com) 只能被该域下的其他域访问(例如foo.www.example.combar.www.example.com),.example.com这些域也可以被example.com下的任何其他域访问(例如foo. example.combar.example.com)。

于 2009-06-30T13:43:09.293 回答
149

以前的答案有点过时了。

RFC 6265于 2011 年发布,基于当时的浏览器共识。从那时起,公共后缀域出现了一些复杂情况。我写了一篇解释当前情况的文章 - http://bayou.io/draft/cookie.domain.html

总而言之,关于 cookie 域应遵循的规则:

  • cookie的源域是发起请求的域。

  • 如果源域是 IP,则不能设置 cookie 的域属性。

  • 如果未设置 cookie 的域属性,则该 cookie 仅适用于其源域。

  • 如果设置了 cookie 的域属性,

    • cookie 适用于该域及其所有子域;
    • cookie 的域必须与源域相同,或者是源域的父域
    • cookie 的域不能是 TLD、公共后缀或公共后缀的父级。

可以得出,cookie 始终适用于其源域。

cookie 域不应有前导点,如.foo.com- 只需使用foo.com

举个例子,

  • x.y.z.com可以为自己或父母设置 cookie 域 - x.y.z.com, y.z.com, z.com. 但不是com,这是一个公共后缀。
  • 带有 domain= 的 cookiey.z.com适用于y.z.com,x.y.z.coma.x.y.z.com

公共后缀示例 - com, edu, uk, co.uk, blogspot.com,compute.amazonaws.com

于 2015-06-05T21:45:04.027 回答
10

要获得广泛的覆盖范围,请查看RFC2965的内容。当然,这并不一定意味着所有浏览器的行为方式都完全相同。

但是,一般来说,如果 cookie 中没有指定默认路径,则默认路径的规则是 Set-Cookie 标头到达的 URL 中的路径。同样,域的默认值是 Set-Cookie 到达的 URL 中的完整主机名。

域的匹配规则要求 cookie 域与发出请求的主机相匹配。cookie 可以通过包含 * 来指定更广泛的域匹配。在 Set-Cookie 的 domain 属性中(浏览器可能会有所不同的这一区域)。匹配路径(假设域匹配)很简单,请求的路径必须在 cookie 上指定的路径内。通常会话 cookie 使用 path=/ 或 path=/applicationName/ 设置,因此 cookie 可用于应用程序的所有请求。


__对添加的回应:__
  • .example.com 的 cookie 是否可用于www.example.com是的
  • .example.com 的 cookie 是否可用于 example.com? 不知道
  • www.example.com是否可以使用 example.com 的 cookie ?不应该但是... *
  • example.com 的 cookie 是否可用于 anotherexample.com?
  • www.example.com能否为 example.com 设置 cookie? 是的
  • www.example.com能否为 www2.example.com 设置 cookie? (通过 .example.com 除外)
  • www.example.com能否为 .com 设置 cookie? (不能在命名空间中设置这么高的 cookie,也不能为 .co.uk 之类的东西设置 cookie)

*我现在无法对此进行测试,但我暗示至少 IE7/6 会将路径 example.com视为.example.com.

于 2009-06-30T10:46:37.837 回答
9

此问题的最后一个(确切地说是第三个)RFC 是 RFC-6265(过时的 RFC-2965 反过来又过时了 RFC-2109)。

根据它,如果服务器省略 Domain 属性,用户代理将仅将 cookie 返回到源服务器(给定资源所在的服务器)。但它也警告一些现有的用户代理将缺少的域属性视为存在域属性并包含当前主机名(例如,如果example.com返回一个没有域属性的 Set-Cookie 标头,这些用户代理将也错误地将 cookie 发送到www.example.com)。

当 Domain 属性被指定时,它将被视为完整的域名(如果属性中有前导点将被忽略)。服务器应该匹配属性中指定的域(具有完全相同的域名或作为它的子域)才能获取此 cookie。更准确地说,它在此处指定

因此,例如:

  • cookie 属性Domain=.example.com等价于Domain=example.com
  • 具有此类域属性的 cookie用于example.comwww.example.com
  • 具有此类域属性的 cookie 将不适用于 another-example.com
  • 指定 cookie 属性 likeDomain=www.example.com将关闭www4.example.com的方式

PS:Domain 属性中的尾随逗号会导致用户代理忽略该属性 =(

于 2013-09-12T15:08:50.387 回答
9

我在 2019 年最新的 Chrome、Firefox、Safari 中测试了所有案例。

回应补充:

  • .example.com 的 cookie 是否可用于 www.example.com?是的
  • .example.com 的 cookie 是否可用于 example.com?是的
  • 用于 www.example.com 的 example.com 的 cookie 是否可用?NO,没有通配符的域只匹配它自己。
  • example.com 的 cookie 是否可用于 anotherexample.com?
  • www.example.com 能否为 example.com 设置 cookie?,它将能够为“.example.com”设置cookie,但不能为“example.com”设置cookie。
  • www.example.com 能否为 www2.example.com 设置 cookie?没有。但它可以为 .example.com 设置 cookie,www2.example.com 可以访问。
  • www.example.com 能否为 .com 设置 cookie?
于 2019-08-09T18:51:46.117 回答
4

众所周知,RFC 不能反映现实。

更好地检查draft-ietf-httpstate-cookie,正在进行中。

于 2010-05-07T15:01:20.910 回答
3

有一些规则可以确定浏览器是否会接受 Set-header 响应标头(服务器端 cookie 写入),使用 Javascript 设置的 cookie 的规则/解释略有不同(我没有测试过 VBScript)。

然后有一些规则可以确定浏览器是否将 cookie 与页面请求一起发送。

主要浏览器引擎如何处理域匹配以及如何解释路径值中的参数之间存在差异。您可以在文章How Different Browsers Handle Cookies Differently中找到一些经验证据

于 2013-05-10T15:47:57.570 回答
2

我很惊讶地阅读了关于拒绝 cookie 的第 3.3.2 节:

https://www.rfc-editor.org/rfc/rfc2965

这表示浏览器应该拒绝来自 xyzcom 域 .z.com 的 cookie,因为“xy”包含一个点。因此,除非我误解了 RFC 和/或上述问题,否则可能会添加一些问题:

.example.com 的 cookie 是否可用于www.yyy.example.com?不。

由源服务器www.yyy.example.com设置的 cookie 是否具有域 .example.com 的值由用户代理发送到 xxx.example.com?不。

于 2011-11-04T21:37:29.517 回答
2

www.example.com可以设置cookie吗.com

不可以,但example.com.fr可以为example2.com.fr. Firefox 通过维护 TLD 列表来防止这种情况发生:http: //securitylabs.websense.com/content/Blogs/3108.aspx

显然 Internet Explorer 不允许两个字母的域设置 cookie,我想这解释了为什么o2.ie简单地重定向到o2online.ie. 我经常想知道这一点。

于 2010-05-07T14:16:15.557 回答