我对当存在多个具有相同名称和路径且对当前域有效的 cookie 时各种浏览器的行为感兴趣。例如。浏览器存储了这两个cookie:
key=value; path=/; domain=foo.bar.baz
key=value; path=/; domain=bar.baz
内容将会是什么Cookie
用户访问时的标题foo.bar.baz
?
RFC 2965 http://www.ietf.org/rfc/rfc2965.txt关于这个问题有这样的说法:
如果多个 cookie 满足上述条件,则它们将按顺序排序
Cookie 标头,以便那些具有更具体 Path 属性的
先于不太具体的内容。相对于其他的排序
属性(例如,域)未指定。
(在我看来,这是一个非常奇怪的设计选择,但这就是我们所拥有的)。我认为服务器端框架使用第一个值,因为它至少有时更具体(我检查了 PHP,它确实如此)。
我想知道主要浏览器的行为:它们会首先发送哪个 cookie? (换句话说,我可以在多大程度上依赖我的应用程序获得“正确的”、更具体的值?)
根据上面的评论:
从我的观点来看,针对这种明显的“未定义行为(标准方面)”的最简单防御就是不使用PHPSESSID
在主域上bar.baz
但相反www.bar.baz
- 子域将正常工作,因为根据标准,在这种情况下没有“后备”,因此 cookie 保留在其自己的子域上。
需要检查一个可能的问题:
在子域上运行的 PHP 脚本可以显式配置为在主域上设置它们的 cookie...如果是这种情况(代码看起来类似于ini_set('session.cookie_domain', 'bar.baz');
)那么您需要将此配置更改为“标准”(通过删除显示的代码),这意味着子域上的脚本应该只在其自己的子域上设置 cookie。
编辑 - 根据评论:
如果您对其他子域没有任何控制权,那么“终极防御”是重命名你的PHPSESSID
cookie 是真正独特的东西(比如 GUIDPHPSESSID
作为前缀)或者通过calling session_name() BEFORE session_start() http://www.php.net/manual/en/function.session-name.php OR by 在配置中设置它 http://www.php.net/manual/en/session.configuration.php#ini.session.name- 这样,无论子域/浏览器版本等如何,您都可以规避整个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)