RFC 2109 和 RFC 2965 是标准化 cookie 处理的历史尝试。不幸的是,它们与浏览器实际所做的没有相似之处,应该完全忽略。
真实世界的行为主要是由最初的 Netscape cookie_spec 定义的,但这作为一个规范是非常有缺陷的,这导致了一系列浏览器的差异,大约 -
- 接受哪些日期格式;
- 当多个匹配项时如何处理同名 cookie;
- 非 ASCII 字符如何工作(或不工作);
- 引用/转义;
- 域匹配是如何完成的。
RFC 6265 试图清理这些混乱并明确规定浏览器应该做什么。它并没有说浏览器应该发送domain
or path
,因为历史上没有浏览器这样做过。
因为您无法检测到 cookie 来自父级domain
(*),所以如果您想将 cookie 分开,您必须注意主机名以避免重叠域 - 特别是对于 IE,即使您不这样做set domain
,设置的 cookieexample.com
将始终继承到foo.example.com
.
所以:如果您认为将来可能想要一个带有单独 cookie 的子域(不应该能够从其父级读取敏感 cookie),请不要为您的站点使用“无 www”主机名;如果您确实需要一个完全独立的 cookie 上下文,以防止evil.example.com
将 cookie 值注入其他example.com
站点,那么您别无选择,只能使用完全独立的域名。
可能对某些攻击模型有效的替代方法是对您生成的每个 cookie 值进行签名,例如使用HMAC。
*:有一种方法。尝试删除与您想要的 cookie 具有相同domain
和path
设置的 cookie。如果你这样做时 cookie 消失了,那么它一定有这些domain
和path
设置,所以原来的 cookie 是可以的。如果那里还有一个 cookie,它来自其他地方,你可以忽略它。如果没有 JavaScript,这样做很不方便,不切实际,而且不是无懈可击的,因为原则上攻击者可能会同时删除他们注入的 cookie。