由于我遇到的奇怪的域/子域cookie问题,我想知道浏览器如何处理cookie。如果它们以不同的方式进行操作,那么也将很高兴知道它们之间的区别。换句话说,当浏览器接收到cookie时,该cookie可能具有域和路径。是否可以,在这种情况下,浏览器可能会用一些默认值替代它们。问题1:它们是什么?

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


已添加:

我之所以问这个原因是因为我对某些极端情况感兴趣。像:


.example.com的cookie可以用于www.example.com吗?
.example.com的cookie可以用于example.com吗?
example.com的cookie可以用于吗? www.example.com
example.com可以使用cookie吗?
anotherexample.com可以为www.example.com设置cookie吗?
example.com可以为www.example.com设置cookie吗?
www2.example.com是否可以?能够为www.example.com设置cookie?
等。

添加了2:

此外,有人可以建议我如何设置cookie以便:


可以通过.comwww.example.com进行设置;
通过example.comwww.example.com均可访问。


#1 楼

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

有域属性值和有效域之间的区别:前者来自Set-Cookie标头字段,后者是对该属性值的解释。根据RFC 2965,应遵循以下规定:


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

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


将此知识应用于您的问题时,应遵循以下条件:


带有Domain=.example.com的cookie可用于www.example.com

带有Domain=.example.com的cookie可用于example.com

带有Domain=example.com的cookie将被转换为.example.com也可用于www.example.com

带有Domain=example.com的cookie不适用于anotherexample.com


www.example.com将能够设置例如example.com



www.example.com的cookie将无法为www2.example.com



www.example.com设置cookie .com将无法为.com设置cookie


并设置和读取www.example.com和example.com的cookie,分别将其设置为.www.example.com.example.com。但是第一个(.www.example.com)仅可用于该域下的其他域(例如foo.www.example.com或bar.www.example.com),其中.example.com也可被example.com下的任何其他域访问(例如foo.example.com或bar.example.com)。

评论


@Gumbo所以a.b.c.example.com可以访问域c.example.com的cookie吗?

–起搏器
2012年7月18日在5:09

很晚才对此问题进行跟进。我自己的经验和经验:webmasters.stackexchange.com/questions/55790/…建议example.com的域不可用于www.example.com,但此示例另有建议。这个例子是错误的,还是我(很可能)误会了。很抱歉线程坏死,但是想确保对于像我这样的未来困惑新手来说,这个出色的答案是100%准确的:)

–errah
2014年4月9日在2:43

这个答案有点过时了;请参阅下面的答案。

–中宇
2015年6月5日在22:11



为什么不将example.com设置可用于www.example.com? (因为它是example.com的“ www”子项?

–纳比尔·汗(Nabeel Khan)
16年1月26日在4:57

Set-Cookie2本身已过时。继续使用Set-Cookie。

– joeforker
18年8月28日在12:47

#2 楼

先前的答案有些过时。

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

总而言之,有关cookie域的规则:


Cookie的原始域是原始请求的域。
如果原始域是IP,则不得设置cookie的domain属性。
如果cookie的domain属性未设置,则cookie仅适用于其原始域。

如果设置了cookie的domain属性,则


,cookie适用于该域,并且所有子域;
cookie的域必须与原始域相同或作为其父域。
cookie的域不得为TLD,公共后缀或公共后缀的父域。



可以推断出cookie始终适用于其原始域。

cookie域不应该带有前导点,因为在.foo.com中-只需使用foo.com

例如,



q43120 79q可以为其自身或父级设置cookie域-x.y.z.comx.y.z.comy.z.com。但不是公共后缀z.com
域为com的cookie适用于y.z.comy.z.comx.y.z.com等。
公共后缀的示例-a.x.y.z.comcomeduukco.ukblogspot.com

评论


@roelleor-相反。编写rfc6265是为了总结在实践中如何实际处理cookie :)是的,rfc可以准确反映主要浏览器的行为。我最近在浏览器上进行的测试证实了这一点。但是,在涉及公共后缀的特殊情况下,它们可能有所不同。

–中宇
2015年7月9日14:07



前导点的后果是什么?

–UpTheCreek
15年11月18日在11:58

@UpTheCreek-根据rfc6265,客户端应忽略前导点

–中宇
2015年12月8日在21:05

x.y.z.com可以将cookie设置为z.com并不奇怪吗?

–罗伊·纳米尔(Royi Namir)
19年3月18日在7:48

因此,如果x.y.z.com可以将cookie设置为y.z.com,并且域名为y.z.com的cookie适用于w.y.z.com ...这是否意味着x.y.z.com可以将cookie设置为w.y.z.com?

–艾奥娜
19年5月7日在3:38



#3 楼

有关广泛的内容,请查阅RFC2965的内容。当然,这并不一定意味着所有浏览器的行为都完全相同。

但是,一般情况下,默认路径的规则(如果Cookie中未指定)是Set- Cookie标头到达。同样,“域”的默认值是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?不知道

example.com的cookie是否可用于www.example.com?不应该,但是... *
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

评论


我在问题中添加了一些有趣的边缘案例。您能否赞扬一下呢?

– Vilx-
09年6月30日在10:58

#4 楼

此问题的最后一个(确切地说是第三个)RFC是RFC-6265(已淘汰RFC-2965,而又又淘汰了RFC-2109)。

如果服务器省略了Domain属性,则用户代理将cookie仅返回到原始服务器(给定资源所在的服务器)。但同时也警告某些现有用户代理将缺少的Domain属性视为存在Domain属性并包含当前主机名(例如,如果exam​​ple.com返回不具有Domain属性的Set-Cookie标头,则这些用户代理会错误地还将cookie发送到www.example.com。

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


cookie属性Domain=.example.com等效于Domain=example.com
具有该域的cookie属性将可用于example.com和www.example.com

具有此类域属性的cookie,不适用于另一个example.com

指定cookie属性,例如Domain=www.example.com将为www4.example.com



PS闭路:域属性中的逗号结尾将导致用户代理忽略该属性=(

#5 楼

我在2019年的最新Chrome,Firefox,Safari中测试了所有情况。

对添加的内容的响应:


.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?不,它将能够为“ .example.com”设置cookie,但不能为“ example.com”设置。
www.example.com能够为www2.example.com设置cookie吗?没有。但是它可以为.example.com设置cookie,而www2.example.com可以访问。
www.example.com可以为.com设置cookie吗?否



评论


Cookie域中的前导域是错误的名称。您的答案与Mozilla在Cookie上的文档直接矛盾:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie,请参阅“网域”部分:与早期的规范相反,域名中的前导点(.example .com)。

–征款
6月25日16:20

#6 楼

已知RFC无法反映现实。

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

#7 楼

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

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

主要浏览器引擎之间在域匹配如何处理以及路径值中的参数如何处理方面存在差异解释。您可以在文章“不同的浏览器如何不同地处理Cookie”中找到一些经验证据。

#8 楼


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


否,但是example.com.fr可以为example2.com.fr设置cookie。 Firefox通过维护TLD列表来防止这种情况:http://securitylabs.websense.com/content/Blogs/3108.aspx

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

评论


“ com.fr”被称为“公共后缀”。 cookie域不能是公共后缀。参见RFC 6265和publicsuffix.org

–中宇
2015年6月5日在21:01



是的,有一个解决方案,但这是一个非常混乱的解决方案。这类标签应放入DNS中,而不是单独进行。

– TRiG
2015年6月6日,下午3:17

是的,也许您指的是“ dbound”。但是,这可能会带来更多问题。例如,对http客户端实现构成挑战。

–中宇
2015年6月6日在3:24

如果此信息以某种方式从浏览器公开到javascript,将很有用。否则,无法以编程方式确定是否可以在特定级别的域上设置Cookie。毕竟,您无法在每次通话时都查看该列表!

– Dtipson
16年11月30日在4:26

#9 楼

我很惊讶地阅读了有关拒绝Cookie的3.3.2节:

http://tools.ietf.org/html/rfc2965

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

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

源服务器www.yyy.example.com设置的cookie(域为.example.com)是否会被用户代理发送到xxx.example.com?否

评论


那个rfc已经过时了。根据浏览器共识,新的rfc 6265允许将带有z.com的cookie应用于z.com和所有子域。

–中宇
2015年6月5日在20:58