我有两个问题。我了解,如果我.mydomain.com
在Cookie 中将域指定为(带有前导点),则所有子域都可以共享一个Cookie。
可以subdomain.mydomain.com
访问在中创建的Cookie mydomain.com
(无需www
子域)吗?
如果在中创建,可以mydomain.com
(没有www
子域)访问cookie subdomain.mydomain.com
?
我有两个问题。我了解,如果我.mydomain.com
在Cookie 中将域指定为(带有前导点),则所有子域都可以共享一个Cookie。
可以subdomain.mydomain.com
访问在中创建的Cookie mydomain.com
(无需www
子域)吗?
如果在中创建,可以mydomain.com
(没有www
子域)访问cookie subdomain.mydomain.com
?
Answers:
这2个域mydomain.com
,subdomain.mydomain.com
并且只有在Set-Cookie
标头中明确命名该域时才能共享cookie 。否则,cookie的范围仅限于请求主机。(这称为“仅主机cookie”。请参阅什么是仅主机cookie?)
例如,如果您从发送了以下标头subdomain.mydomain.com
,则不会向以下请求发送Cookie mydomain.com
:
Set-Cookie: name=value
但是,如果您使用以下内容,它将在两个域中都可用:
Set-Cookie: name=value; domain=mydomain.com
该Cookie将发送到mydomain.com的任何子域,包括嵌套的子域,例如subsub.subdomain.mydomain.com
。
在RFC 2109中,没有前导点的域意味着它不能在子域上使用,而只能在前导点(.mydomain.com
)允许它在多个子域中使用(但不能在顶级域中使用,所以您要问的是在旧版规范中是不可能的)。
但是,所有现代浏览器都遵循较新的规范RFC 6265,并且将忽略任何前导点,这意味着您可以在子域以及顶级域上使用cookie。
总而言之,如果您像上面的第二个示例一样设置cookie mydomain.com
,则可以通过进行访问subdomain.mydomain.com
,反之亦然。这也可以用来允许sub1.mydomain.com
和sub2.mydomain.com
共享Cookie。
也可以看看:
domain=.mydomain.com
对于裸mydomain.com无效,因此这两个RFC彼此不兼容。
我不确定@cmbuckley答案是否显示完整图片。我读的是:
除非cookie的属性另有说明,否则cookie仅返回到原始服务器(而不返回到任何子域),并且在当前会话结束时到期(由用户代理定义)。用户代理忽略无法识别的cookie。
也
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测试站点,用于那些像我这样回答中错过它的人;值得滚动和赞美/:
domain
,否则cookie仅用于请求主机。这意味着Set-Cookie: name=value
from mydomain.com
不会与请求一起发送到子域。也可以使用此测试脚本。
这是使用DOM cookie API(https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie的示例),因此我们可以亲自观察一下行为。
如果执行以下JavaScript:
document.cookie =“键=值”
它似乎与执行相同:
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的类型。
domain
属性使cookie在子域上起作用;没有这样的属性就不行)。最好不要忽略前导点,最坏的情况下会主动阻塞。
请大家注意,您可以从域中的子域设置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
如果规范化的请求主机与域属性不匹配,请执行以下操作:完全忽略cookie,并中止这些步骤。
域匹配
如果至少满足以下条件之一,则字符串域与给定的域字符串匹配:
域字符串和字符串相同。(请注意,此时域字符串和字符串都将被规范化为小写。)
满足以下所有条件:
域字符串是字符串的后缀。
域字符串中不包含的字符串的最后一个字符是%x2E(“。”)字符。
该字符串是主机名(即,不是IP地址)。
因此,“ subdomain.mydomain.com”域匹配“ mydomain.com”,但是“ mydomain.com”不域匹配“ subdomain.mydomain.com”
也检查此答案。
如果在localhost上工作,请小心!如果您将cookie存储在js中,如下所示:
document.cookie = "key=value;domain=localhost"
您的子域可能无法访问它,例如sub.localhost
。为了解决此问题,您需要使用Virtual Host。例如,您可以使用配置虚拟主机,ServerName
localhost.com
然后就可以将cookie存储在域和子域中,如下所示:
document.cookie = "key=value;domain=localhost.com"
简单的解决方案
setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);
Setcookie的第5个参数确定cookie可用的(子)域。将其设置为(EXAMPLE.COM)使其可用于任何子域(例如:SUBDOMAIN.EXAMPLE.COM)