Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/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
Cookies 具有相同名称/路径的多个cookie的浏览器行为_Cookies - Fatal编程技术网

Cookies 具有相同名称/路径的多个cookie的浏览器行为

Cookies 具有相同名称/路径的多个cookie的浏览器行为,cookies,Cookies,当存在多个对当前域有效的具有相同名称和路径的cookie时,我对各种浏览器的行为感兴趣。例如,浏览器已存储这两个cookie: key=value; path=/; domain=foo.bar.baz key=value; path=/; domain=bar.baz 当用户访问foo.bar.baz时,Cookie标题的内容是什么 关于这个问题有这样的说法: 如果多个Cookie满足上述条件,则按顺序排列 Cookie标头,使那些具有更特定路径属性的 先于那些不太具体的。相对于其他产品的订

当存在多个对当前域有效的具有相同名称和路径的cookie时,我对各种浏览器的行为感兴趣。例如,浏览器已存储这两个cookie:

key=value; path=/; domain=foo.bar.baz
key=value; path=/; domain=bar.baz
当用户访问
foo.bar.baz
时,
Cookie
标题的内容是什么

关于这个问题有这样的说法:

如果多个Cookie满足上述条件,则按顺序排列 Cookie标头,使那些具有更特定路径属性的 先于那些不太具体的。相对于其他产品的订购 未指定属性(例如域)

(在国际海事组织,这是一个非常奇怪的设计选择,但这正是我们所拥有的)。我假设服务器端框架使用第一个值,因为这至少有时更具体(我检查了PHP,它确实如此)


我想知道的是主要浏览器的行为:他们会首先发送哪个cookie?(换句话说,我能在多大程度上依靠我的应用程序获得“正确的”,更具体的值?

根据上面的评论:

针对我的POV中这种明显的“未定义行为(标准方面)”的最简单防御方法是不要在主域
bar.baz
上使用
PHPSESSID
,而是在
www.bar.baz
上使用-根据标准,子域将可以正常工作,因为没有“回退”在这种情况下,cookie保留在自己的子域上

需要检查一个可能的问题:

在子域上运行的PHP脚本可以显式配置为在主域上设置cookie。。。如果是这种情况(代码看起来类似于ini_set('session.cookie_domain','bar.baz');),那么您需要将此配置更改为“标准”(通过删除显示的代码),这意味着子域上的脚本只应在其自己的子域上设置cookie

编辑-根据评论:


如果您无法控制其他子域,那么“终极防御”是将
PHPSESSID
cookie重命名为真正唯一的名称(例如前缀为
PHPSESSID
的GUID)通过或通过-无论子域/浏览器版本等如何,您都可以绕过整个问题。

我认为,无论当前任何浏览器的行为如何,您都不能依赖这样一个实际的答案,因为标准上说“未指定”任何浏览器/任何版本都可以随时改变这种行为…这不是真正的依赖,更多的是防御它。。。这可能导致同一父域上的两个站点以不可预测的方式改变彼此的行为。(事实上,我就是这样发现的,这两个网站都使用了PHPSESSID cookie,人们莫名其妙地注销了。)我不确定我是否理解。。。你想防御基于经验答案的“未定义行为”(标准明智),一旦出现新的浏览器补丁或版本,这些回答可能会过时/不完整?您将如何对此进行防御以及如何保持防御?从我的POV中最简单的防御是不在主域
bar.baz
上使用PHPSESSID-其余的将正常工作,因为根据标准,没有“回退”,因此cookie保留在自己的子域上。。。也许甚至有一些配置错误的PHP脚本在子域上运行,它们将cookie显式地设置在主域上?尝试使用Firefox插件YSlow(Yahoo Slow)学习有趣的评论,其中有很多建议,其中一个应该回答您的问题(查找“静态域名”)。问题是,即使我确保始终在
www.bar.baz
上设置Cookie(无论如何,我都会这样做,在
bar.baz
上设置Cookie会有几个缺点,从图像/脚本请求大小增加到会话劫持漏洞),在
其他网站上的脚本。bar.baz
(可能维护得不太好,或者不在我的控制之下)仍然会干扰我的登录过程。我想知道这样的问题有多普遍。@Tgr我不理解这个问题…请参阅我的编辑,以获得一个独立于浏览器/版本的解决方案,并且可以以一种即使行为不正常的子域也不会给您的子域带来问题的方式实现…HTHChanging session的名称n cookie当然是一个好主意,但是有很多cookie可能会发生冲突,有些是固定名称的(比如Google Analytics tracking cookie)。我想知道的是,在多大比例的浏览器上,这可能是一个问题。