【问题标题】:Browser behavior for multiple cookies with same name/path具有相同名称/路径的多个 cookie 的浏览器行为
【发布时间】:2011-12-21 07:45:50
【问题描述】:

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

key=value; path=/; domain=foo.bar.baz
key=value; path=/; domain=bar.baz

当用户访问foo.bar.baz时,Cookie header的内容是什么?

RFC 2965 对这个问题有这样的看法:

如果多个 cookie 满足上述条件,它们将按顺序排列 Cookie 标头,以便具有更具体 Path 属性的那些 在那些不太具体的人之前。相对于其他订购 属性(例如,域)未指定。

(这是 IMO 一个非常奇怪的设计选择,但这就是我们所拥有的)。我想服务器端框架使用第一个值,因为它至少有时更具体(我检查了 PHP,它确实这样做了)。

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

【问题讨论】:

  • 我认为,无论目前任何浏览器的行为如何,您都不能依赖这样的经验性答案,因为标准说“未指定”并且任何浏览器/任何版本都可以随时更改此行为。 ..
  • 这不是真正的依赖,更多的是防御它......这可能导致同一父域上的两个站点以不可预知的方式改变彼此的行为。 (实际上我就是这样发现的,两个网站都使用了 PHPSESSID cookie,人们莫名其妙地退出了。)
  • 不确定我是否理解...您想根据经验答案来防御“未定义行为”(标准方面),一旦有了新的浏览器补丁或版本,该答案可能会过时/不完整过来 ?您将如何防御这种情况以及如何使防御保持最新状态?
  • 对我的 POV 最简单的防御是不在主域 bar.baz 上使用 PHPSESSID - 其余的都可以正常工作,因为根据标准没有“回退”,因此 cookie 保留在其上自己的子域...也许甚至在子域上运行了一些配置错误的 PHP 脚本,这些脚本在主域上显式设置了它们的 cookie?
  • 尝试使用 Firefox 插件 YSlow (Yahoo Slow) 学习有趣的 cmets,其中有大量建议,其中一个应该回答您的问题(查找“静态域名”)。跨度>

标签: cookies


【解决方案1】:

按照上面的cmets:

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

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

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

编辑 - 根据 cmets:

如果您对其他子域没有任何控制权,那么 “终极防御” 就是将您的 PHPSESSID cookie 重命名为真正独特的名称(例如以 PHPSESSID 为前缀的 GUID ) 通过calling session_name() BEFORE session_start() 或setting it in the config - 这样您就可以规避整个问题,而不管子域/浏览器版本等。

【讨论】:

  • 问题是,即使我确保始终在 www.bar.baz 上设置 cookie(无论如何我都会这样做,在 bar.baz 上设置 cookie 也会有几个缺点,从增加图像/脚本请求大小到会话劫持漏洞),someothersite.bar.baz 上的脚本(可能维护得不太好,或者不受我控制)仍然可以干扰我的登录过程。我想知道这样的问题有多普遍。
  • @Tgr 我不明白这个问题...请参阅我的编辑以获取独立于浏览器/版本的解决方案,并且可以以即使行为不端的子域也不会给您带来问题的方式实施子域... HTH
  • 更改会话 cookie 的名称当然是个好主意,但有许多 cookie 可能会发生冲突,其中一些具有固定名称(例如 Google Analytics 跟踪 cookie)。我想知道的是,有多少百分比的浏览器会出现问题。
猜你喜欢
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2017-01-30
相关资源
最近更新 更多