同一域内的 cookie 路径保护

信息安全 网页浏览器 http 饼干 同源策略
2021-08-28 04:36:02

这个关于 cookie 如何在子域之间易受攻击的问题的答案引发了我的好奇心

据我所知,如果 cookie 设置在同一域 ( www.example.com/dogs) 的子路径上,则任何其他路径都无法访问它,除非它是路径的子文件夹。即既不www.example.com/cats也不www.example.com/应该访问这些cookies,但www.example.com/dogs/labrador会。

进一步阅读,我发现可以从不同的路径获取 cookie:

需要注意的是,路径限制不能防止未经授权从不同路径读取 cookie。它可以通过简单的 DOM 轻松绕过(例如,通过使用 cookie 的路径创建隐藏的 iframe 元素,然后访问此 iframe 的 contentDocument.cookie 属性)。由于相同的来源策略,保护 cookie 访问的唯一方法是使用不同的域或子域。

如果是这种情况,那么 cookie-path 提供什么安全性(甚至功能)?如果它可以使用 iframe 读取,为什么不能直接在 javascript 中访问?这种“限制”是否真的给人一种虚假的安全感?

1个回答

cookie 路径不提供任何安全性(在大多数实际情况下)。

重要的是要了解 cookie 规范是古老的技术。它可以追溯到网络的早期。从那时起,网络的安全模型已经发展,并且变得更加经过深思熟虑。cookie 的安全模型并没有相应地发展。

作为网络安全模型和 cookie 之间阻抗不匹配的另一个示例,同源策略被视为www.example.com:80与 不同的源www.example.com:81,但出于 cookie 的目的,它们被视为相同。您可以从 Michal Zalewski找到更多关于cookie 安全异常的讨论。

Cookie 可以通过 Javascript 读取。虽然浏览器可能会在 Javascript 尝试读取 cookie 时考虑路径,但这不是一项安全功能:路径不是安全边界,因此一个页面上的恶意 Javascript 仍然可以读取其他路径的 cookie(例如,通过打开一个具有正确路径的不可见 iframe,将恶意 Javascript 注入其中,然后抓取 cookie)。唯一有效的安全边界是在源的粒度上。因此,从安全角度来看,底线是:恶意 Javascriptwww.example.com/dogs可以读取路径为www.example.com/cats.

在实践中,开发人员通常会避免这些从早期遗留下来的极端情况,或者至少避免依赖它们来提供额外的安全性。例如,Web 开发人员不应该依赖 cookie-path 来提供安全性(充其量它会减少发回的 cookie 的数量,这在某些情况下可能用于减少带宽)。再举一个例子,现在的网站通常会避免从非标准端口号提供内容,因为这种情况是另一个极端情况,会暴露出意想不到的语义。

在这一点上,cookie 路径主要是早期的遗迹。据我所知,它不再有太大的用途,如果从未引入过 cookie-path,那么今天您可能永远不会注意到。但是出于向后兼容的原因,浏览器仍然需要支持它。就这样,在网络上。最好不要将网络视为精心设计的人工制品,而是将其视为随着时间的推移而演变的东西——因此,它已经积累了现在无用的垃圾,就像我们的附录一样。