Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 在子域和域之间共享cookie_Http_Cookies_Subdomain - Fatal编程技术网

Http 在子域和域之间共享cookie

Http 在子域和域之间共享cookie,http,cookies,subdomain,Http,Cookies,Subdomain,我有两个问题。我理解,如果我在cookie中指定域为.mydomain.com(带前导点),则所有子域都可以共享一个cookie subdomain.mydomain.com是否可以访问在mydomain.com中创建的cookie(没有www子域) 如果在subdomain.mydomain.com中创建了cookie,那么mydomain.com(没有www子域)可以访问cookie吗?只有在设置cookie头中明确命名域时,这两个域mydomain.com和子域.mydomain.com才

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

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


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

只有在
设置cookie
头中明确命名域时,这两个域
mydomain.com
子域.mydomain.com
才能共享cookie。否则,cookie的作用域仅限于请求主机。(这称为“仅主机cookie”。请参阅)

例如,如果您从
subdomain.mydomain.com
发送以下标头,则不会将cookie发送到
mydomain.com

Set-Cookie: name=value
但是,如果您使用以下内容,它将在两个域上都可用:

Set-Cookie: name=value; domain=mydomain.com
此cookie将针对mydomain.com的任何子域发送,包括嵌套子域,如
subsubsub.subdomain.mydomain.com

在中,没有前导点的域意味着它不能在子域上使用,并且只有前导点(
.mydomain.com
)才允许它跨多个子域使用(但不是顶级域,因此在旧规范中您所要求的是不可能的)

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

总之,如果您在
mydomain.com
中设置了类似上面第二个示例的cookie,则
subdomain.mydomain.com
可以访问它,反之亦然。这也可用于允许
sub1.mydomain.com
sub2.mydomain.com
共享cookie

另见:

  • 试一试
简单解决方案

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);
Setcookie的第5个参数确定cookie可用于的(子)域。将其设置为(EXAMPLE.COM)将使其可用于任何子域(例如:subdomain.EXAMPLE.COM)


参考资料:

我不确定@cmbuckley answer是否显示了全部情况。我读到的是:

除非cookie的属性另有指示,否则cookie是 仅返回到源服务器(例如,不返回到任何 子域),并在当前会话结束时过期(如 由用户代理定义)。用户代理忽略无法识别的cookie

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

@cmbuckley/为那些像我一样在他的回答中漏掉的人提供了很棒的cookies测试站点;值得向上滚动和向上投票/:


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


其他答案增加了宝贵的见解,但主要描述了Chrome中的行为。需要注意的是,IE中的行为完全不同。CMBuckley非常有用的测试脚本表明,在(比如)Chrome中,当没有指定域时,Cookie不会在根域和子域之间共享。然而,IE中的相同测试表明它们是共享的。该IE案例更接近CMBuckley的www或not www链接中的带回家的描述。我知道这是因为我们的系统在根域和子域上使用了不同的servicestack Cookie。直到有人在IE中访问它,这两个系统就谁的会话cookie会赢进行了争论,直到我们炸毁了缓存。这里是一个使用DOM cookie API()的示例,因此我们可以自己看到这种行为

如果我们执行以下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会违反安全性。

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

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

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

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

为什么? 根据规格

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

域匹配

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

  • 域字符串和字符串是相同的。(请注意 域字符串和字符串将被规范化为 此时请使用小写。)

  • 以下所有条件均成立:

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

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

    • <
      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.
      
      Set-Cookie: name=value; Domain=mydomain.com // GOOD
      
      Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie
      
      document.cookie = "key=value;domain=localhost"
      
      document.cookie = "key=value;domain=localhost.com"