在子域和域之间共享cookie

时间:2013-08-28 15:46:53

标签: http cookies subdomain

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

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

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

8 个答案:

答案 0 :(得分:516)

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

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

Set-Cookie: name=value

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

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。

另见:

答案 1 :(得分:24)

我不确定@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测试网站/那些像我一样错过它的人;值得向上滚动和提升/:

答案 2 :(得分: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 :(得分:3)

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

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

答案 4 :(得分:3)

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

(在响应中发送,用于请求subdomain.mydomain.com

Set-Cookie: name=value; Domain=mydomain.com // GOOD

但是您不能设置子域中某个域的Cookie。

(在响应中发送,用于请求mydomain.com

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie

为什么?

根据规范RFC 6265 section 5.3.6 Storage Model

  

如果规范化的请求主机未域匹配域属性,请执行以下操作:完全忽略Cookie并中止这些步骤。

RFC 6265 section 5.1.3 Domain Matching

  

域匹配

     

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

     
      
  1. 域字符串和字符串相同。 (请注意,     域字符串和该字符串将被规范化为     小写字母。)

  2.   
  3. 满足以下所有条件:

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

    •   
    • 字符串中不包含的最后一个字符    域字符串是%x2E(“。”)字符。

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

    •   
  4.   

因此,“ subdomain.mydomain.com”域匹配“ mydomain.com”,但“ mydomain.com”不匹配“ subdomain.mydomain.com”

还要选中this answer

答案 5 :(得分:0)

如果在localhost上工作,请小心! 如果您将cookie存储在js中,如下所示:

document.cookie = "key=value;domain=localhost"

您的子域可能无法访问它,例如sub.localhost。为了解决此问题,您需要使用Virtual Host。例如,您可以使用ServerName localhost.com配置虚拟主机,然后将cookie像这样存储在您的域和子域中:

document.cookie = "key=value;domain=localhost.com"

答案 6 :(得分:0)

实际上,就我而言,我想在 sd.test.irCookie.set('key', 'value', { domain: '.facebook.com' }) // adding a . before domain name 域和子域之间共享 cookie 数据,以便在使用 js-cookie 的浏览器中轻松使用 cookie,并且为了共享,我模仿 < strong>Facebook 解决方案:

{{1}}

通过上述代码的设置,您可以访问基域和子域中的 cookie 数据。

答案 7 :(得分:-3)

简单的解决方案

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

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

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