编辑注:太平洋时间 4 月 6 日下午 7:00 - 对这个问题进行更多调查后,似乎最初指向 Content-Disposition 的分析是基于错误的信息。一些浏览器没有缓存直接消息的原因是 Twitter 在响应中包含了非标准的 Pragma: no-cache 标头。使用 Pragma 是无效的,因为它被 定义为仅针对请求等效于 Cache-Control: no-cache。虽然这很反直觉,但“no-cache”并不会阻止缓存存储内容;“no-cache”仅意味着缓存需要在重用该响应之前与服务器进行检查。这并不改变结论:有限的行为观察不能代替基于标准的构建。
Twitter 正在告诉其用户,他们的 个人直接消息可能存储在 Firefox 的网络缓存中。
此问题影响所有在共享计算机帐户上使用 Firefox 访问 Twitter 的用户。这些用户应该 清除他们的缓存。
这篇文章解释了此问题是如何发生的,对可能受到影响的人员的影响是什么,以及如何在未来避免此类问题。为了达到目的,我们需要深入了解网络缓存的工作原理。
在 Mozilla 博客上,Firefox 的 CTO Eric Rescorla 分享了他对 关于 Firefox 上 Twitter 的一些事项 的见解,并附带以下重要提醒
网络很复杂,很难了解网络的方方面面。但是,这也提醒我们,拥有网络标准的重要性,而不是仅仅依靠某个特定浏览器恰好能做什么。
网络缓存隐私基础知识
缓存对于网络性能至关重要。浏览器缓存内容,以便可以重复使用内容,而无需与服务器通信,因为服务器速度可能很慢。但是,网络内容的缓存方式可能非常混乱。
互联网工程任务组 发布了 RFC 7234,它定义了网络缓存的工作原理。一个关键机制是 Cache-Control
标头,它允许 Web 服务器说明他们希望缓存如何处理内容。
网站可以使用 Cache-Control 来让浏览器知道哪些内容可以安全地存储在缓存中。某些内容需要每次都获取;其他内容仅在短时间内有效。Cache-Control 告诉浏览器哪些内容可以缓存以及缓存时间。或者,如本例所示,Cache-Control 可以告诉浏览器内容很敏感,并且不应该存储该内容。
另外,在没有来自网站的 Cache-Control 指令的情况下,浏览器通常会猜测哪些内容可以缓存。网站通常不会为内容提供任何缓存信息。但缓存内容会使网络更快。因此,浏览器会缓存大多数内容,除非他们被告知不要这样做。这被称为“启发式缓存”,它因浏览器而异。
启发式缓存涉及浏览器猜测哪些内容被缓存以及缓存时间。Firefox 启发式缓存会存储大多数内容,而不会为内容提供明确的缓存信息,持续时间为 7 天。
Cache-Control 提供了很多控制功能,但与本例最相关的是一个名为“no-store”的指令。当网站说“no-store”时,它告诉浏览器永远不要在它的缓存中保存内容副本。使用“no-store”是保证信息永远不会被缓存的唯一方法。
Twitter 的案例
在本例中,Twitter 没有为 直接消息 包含“no-store”指令。直接消息的内容很敏感,因此不应该存储在浏览器缓存中。但是,如果没有 Cache-Control 或 Expires,浏览器就会使用启发式缓存逻辑。
来自 Twitter 的测试表明该请求没有在其他浏览器中被缓存。这是因为其他一些浏览器会禁用启发式缓存,如果存在一个无关的 HTTP 标头,Content-Disposition。Content-Disposition 是一项功能,它允许网站识别要下载的内容,并建议一个名称来保存该内容。
相比之下,Firefox 合理地将 Content-Disposition 视为无关,因此在存在 Content-Disposition 时不会禁用启发式缓存。
Twitter 用于直接消息的 HTTP 消息不包含任何 Cache-Control 指令。对于 Firefox 用户来说,这意味着即使 Twitter 用户注销了,直接消息也会存储在他们计算机上的浏览器缓存中。
谁会受到影响?
Firefox 尽可能维护独立的缓存。
在同一台计算机上拥有不同用户帐户的人将拥有自己的缓存,这些缓存彼此完全不可访问。共享帐户但在使用不同 Firefox 配置文件的人将拥有不同的缓存。
Firefox 还提供控制功能,允许用户控制存储的内容。使用 隐私浏览 意味着缓存的数据不会存储到永久存储中,并且任何缓存都会在窗口关闭时被丢弃。Firefox 还提供其他控制功能,例如清除最近历史记录、忘记此网站以及自动清除历史记录。所有这些选项都已记录在 此处。
此问题仅影响在同一台计算机上共享帐户且未使用任何这些隐私技术清除其缓存的人员。虽然他们可能已从 Twitter 注销,但他们的直接消息将保留在他们的存储缓存中。
其他随后使用同一 Firefox 配置文件的用户可能不会意外访问缓存的直接消息。但是,在计算机上共享同一帐户的用户可能能够找到并访问包含这些消息的缓存文件。
用户可以做什么
在他们的计算机上与任何人都不共享帐户的人可以放心,他们的直接消息是安全的。无需采取任何操作。
使用共享计算机帐户的人可以清除他们的 Firefox 缓存。使用 清除最近历史记录 仅清除浏览器缓存将删除任何 Twitter 直接消息。
网站开发人员可以做什么
我们建议网站使用 Cache-Control: no-store 仔细识别私密信息。
这里的一个常见误解是 Cache-Control: private 将解决此问题。“private”指令用于共享缓存,例如由 CDN 提供的缓存。将内容标记为“private”不会阻止浏览器缓存。
更一般地来说,构建网站的开发人员需要了解标准和观察到的行为之间的区别。浏览器当下的行为是可以观察和测量的,但除非行为基于已记录的标准,否则不能保证这种行为永远保持不变。