为什么在HTTP响应中应同时使用无缓存和无存储?


120

我被告知要防止用户信息泄漏,仅“ no-cache”响应是不够的。“无存储”也是必要的。

Cache-Control: no-cache, no-store

在阅读了该规范http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html之后,我仍然不太确定为什么。

我目前的理解是,它仅适用于中间缓存服务器。即使响应“无缓存”,中间缓存服务器仍可以将内容保存到非易失性存储中。中间缓存服务器将决定是否将保存的内容用于后续请求。但是,如果响应中包含“ no-store”,则不应将中间缓存服务器存储为内容。因此,它更安全。

还有其他原因同时需要“无缓存”和“无存储”吗?


3
no-cache并不意味着您认为的那样。实际上,它的意思是“请重新验证”。
Erwan Legrand

Answers:


77

我必须澄清,no-cache这并不意味着不缓存。实际上,这意味着在每个请求上使用您可能拥有的任何缓存响应之前,都要“使用服务器重新验证”。

must-revalidate另一方面,仅在资源被视为过时时才需要重新验证。

如果服务器说资源仍然有效,则高速缓存可以使用其表示来响应,从而减轻了服务器重新发送整个资源的需要。

no-store是完全不缓存指令,旨在防止以任何形式的缓存存储表示。

我什么都说,但是请在RFC 2616 HTTP规范中注意这一点:

历史缓冲区可以将此类响应存储为其正常操作的一部分

但这是新版RFC 7234 HTTP规范中省略的,可能会试图变得no-store更强大,请参见:

http://tools.ietf.org/html/rfc7234#section-5.2.1.5


18
还没回答这个问题:为什么无缓存无店应该在HTTP响应中使用?还Cache-Control: no-store不够吗
富兰克林·于

浏览器之间有区别吗?因为这篇来自Microsoft docs.microsoft.com/zh-cn/iis/configuration/system.webServer/的文章甚至没有提到no-store并描述no-cache它根本不进行缓存...。我很困惑!
Roel

Alconja的答案就是这个问题的答案。当我回答时,我这样做只是为了阐明一个非常普遍的观念。请投票其他答案!
路加·普普利特

48

在某些情况下,即使Cache-Control: no-cache在响应头中,IE6仍将缓存文件。

W3C指出的no-cache

如果no-cache指令未指定字段名,则在未经原始服务器成功重新验证的情况下,缓存不得使用响应来满足后续请求。

在我的应用程序中,如果您访问了带有no-cache页眉的页面,然后注销,然后在浏览器中返回,则IE6仍会从缓存中获取页面(无需向服务器发送新的/验证请求)。在no-store标题中添加阻止它这样做。但是,如果您信奉W3C,实际上就无法控制这种行为:

历史缓冲区可以将此类响应存储为其正常操作的一部分。

规范的特定小节中介绍浏览器历史记录和常规HTTP缓存之间的一般差异。


7
当您在浏览器中进行回击时,IE6不会从缓存中获取页面。它从历史记录缓冲区中获取页面。
Pacerier's

1
在Chrome 34(2014)中,仍然需要进行设置no-store。否则,当使用“后退”按钮时,Chrome浏览器将显示缓存/缓冲的数据。
caw 2014年

4
-1,因为第一句错误地暗示浏览器缓存具有no-cache标头的响应是不正确的。紧随其后的W3C报价清楚表明情况并非如此。相反,no-cache标头仅意味着响应必须被重新验证,然后才能重新用于响应后续请求。
Mark Amery

1
规范的措词已从RFC1616改进到规范的当前版本(RFC的tools.ietf.org/html/rfc7230系列)。一个家庭,因为它是6个RFC。他们过时的2616
Arcin乙

16

根据HTTP 1.1规范

没有商店

没有商店的目的指令是为了防止敏感信息的意外释放或保留(例如,在备份磁带上)。no-store指令适用于整个消息,可以在响应或请求中发送。如果在请求中发送,则缓存不得存储该请求或其任何响应的任何部分。如果在响应中发送,则缓存不得存储该响应或引起它的请求的任何部分。该指令适用于非共享和共享缓存。在这种情况下,“不得存储”表示缓存不得在非易失性存储中有意存储信息,并且必须尽最大努力在转发信息后尽快从易失性存储中删除信息。即使该指令与响应相关联,用户可以在缓存系统外部显式存储这样的响应(例如,使用“另存为”对话框)。历史缓冲区可以将此类响应存储为其正常操作的一部分。该指令的目的是满足某些用户和服务作者的要求,这些用户和服务作者担心通过意外访问缓存数据结构而意外释放信息。尽管在某些情况下使用此指令可能会改善隐私,但是我们提醒您,它绝对不是确保隐私的可靠或充分的机制。尤其是,恶意的或受损的缓存可能无法识别或遵守此指令,并且通信网络可能容易受到窃听。历史缓冲区可以将此类响应存储为其正常操作的一部分。该指令的目的是满足某些用户和服务作者的要求,这些用户和服务作者担心通过意外访问缓存数据结构而意外释放信息。尽管在某些情况下使用此指令可能会改善隐私,但是我们提醒您,它绝对不是确保隐私的可靠或充分的机制。尤其是,恶意的或受损的缓存可能无法识别或遵守此指令,并且通信网络可能容易受到窃听。历史缓冲区可以将此类响应存储为其正常操作的一部分。该指令的目的是满足某些用户和服务作者的要求,这些用户和服务作者担心通过意外访问缓存数据结构而意外释放信息。尽管在某些情况下使用此指令可能会改善隐私,但是我们提醒您,它绝对不是确保隐私的可靠或充分的机制。尤其是,恶意的或受损的缓存可能无法识别或遵守此指令,并且通信网络可能容易受到窃听。尽管在某些情况下使用此指令可能会改善隐私,但是我们提醒您,它绝对不是确保隐私的可靠或充分的机制。尤其是,恶意的或受损的缓存可能无法识别或遵守此指令,并且通信网络可能容易受到窃听。尽管在某些情况下使用此指令可能会改善隐私,但是我们提醒您,它绝对不是确保隐私的可靠或充分的机制。尤其是,恶意的或受损的缓存可能无法识别或遵守此指令,并且通信网络可能容易受到窃听。


1
如果您尚未缓存请求,那是否已经可以防止将响应存储在非易失性媒体中?
冒犯君主

4
@Lèsemajesté通常不是。 no-cachemax-age=0说该商品被认为是陈旧的。这意味着在投放之前必须对其进行重新验证。这意味着缓存可以存储文件,然后执行服务器可以响应的条件请求304 NOT MODIFIED。这显然是一个巨大的优势,因为不需要生成和发送响应的正文。因此,要利用许多(大多数?)缓存,存储no-cache响应。
凯文·考克斯

14

如果要防止所有缓存(例如,使用“后退”按钮时强制重新加载),则需要:

  • IE的无缓存

  • Firefox的无店

这里有我的信息:

http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/


6
为什么没有存储不足以容纳Internet Explorer?您的博客文章没有解释。
Simon Lieschke'3

1
您正在谈论哪个IE版本?
Pacerier

1
@Pacerier,可能是他/她写评论时的最新IE版本。根据维基百科,这是IE7。对于FF,它看起来像3。仍然没有多少人使用。
trysis

11

no-store在正常情况下应该没有必要,它会损害速度和可用性。它适用于HTTP响应包含如此敏感的信息的情况,无论它对用户造成了什么负面影响,都绝对不应将其完全写入磁盘缓存。

这个怎么运作:

  • 通常,即使诸如浏览器之类的用户代理确定不应缓存响应,由于用户代理内部的原因,它仍可能将其存储到磁盘缓存中。此版本可用于“查看源代码”,“后退”,“页面信息”等功能,在这些功能中,用户不一定要再次请求页面,但浏览器不会将其视为新的页面视图并且提供与用户当前正在查看的相同版本是有意义的。

  • 使用no-store将阻止存储该响应,但是这可能会影响浏览器提供“视图源”,“后退”,“页面信息”等的能力,而无需对服务器提出新的单独请求,这是不希望的。换句话说,用户可以尝试查看源,并且如果浏览器没有将其保存在内存中,系统将告知他们这是不可能的,否则将导致对服务器的新请求。因此,no-store仅应在确保内容不存储在缓存中的重要性超过了这些功能无法正常或快速运行的受阻碍的用户体验时使用。

我目前的理解是,它仅适用于中间缓存服务器。即使响应“无缓存”,中间缓存服务器仍可以将内容保存到非易失性存储中。

这是不正确的。与HTTP 1.1兼容的中间缓存服务器将遵循no-cachemust-revalidate指令,以确保不缓存内容。使用这些指令将确保任何中间缓存都不会缓存响应,并且将所有后续请求发送回原始服务器。

如果中间缓存服务器不支持HTTP 1.1,那么您将需要使用Pragma: no-cache并希望达到最佳效果。请注意,如果它不支持HTTP 1.1,则no-store无论如何都没有关系。


3
我误解了吗,因为mnot.net/cache_docs/#CACHE-CONTROL与您矛盾。它说,no-cache在不牺牲高速缓存所有好处的情况下,可以保持严格的新鲜度,这意味着如果服务器响应304 Not Modified,则高速缓存将被存储并再次使用。
Pacerier's

-1:不缓存不表示不能缓存内容。在14.9.1 What Is Cachable中,规范说:“如果no-cache指令未指定字段名,则在未经原始服务器成功重新验证的情况下,缓存不得使用响应来满足后续请求。” (w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9。 )正如克里斯·夏夫利特解释说,它“不会阻止缓存系统从保持缓存副本,而只是要求缓存系统重新验证其缓存之前寄回给客户。” (HTTP开发人员手册,第91页)
james.garriss

我不认为我在此答案中写的内容会引起两条评论中的任何一条-我只是没有谈论浏览器如何重新验证(例如,使用If-Modified-Since / If-None-Match),因为我不认为这是因为相关的。我什至没有试图涵盖无缓存的含义,所以我很难理解@ james.garriss的评论与我的答案之间的关系。
thomasrutter 2014年

7

如果缓存系统正确地实现了无存储,那么您就不需要无缓存。但并非全部。此外,某些浏览器实现了无缓存,就像没有存储一样。因此,虽然没有严格要求,但同时包含这两种方法可能是最安全的。


”“ 但不是所有的。我们需要一个具体的例子来说服我的同事。
富兰克林·于

该评论是在6年前提出的。您需要调查缓存服务器的当前行为,以查看它们在做什么。
james.garriss

6

请注意,从版本5到版本8的Internet Explorer在尝试下载通过https和服务器发送Cache-Control: no-cachePragma: no-cache标头提供的文件时将引发错误。

请参阅http://support.microsoft.com/kb/812935/en-us

使用Cache-Control: no-storePragma: private似乎是最有效的方法。


2
相关SO答案中所建议您可以Cache-Control: no-store, no-cache, must-revalidate按照确切的顺序进行设置以使其正常工作。但是,这在我们的方案中不起作用,但是上面的@bassim建议起作用了。谢谢!
Eirik H

6

对于chrome,无缓存用于在重新访问时重新加载页面,但如果您返回历史记录(返回按钮),它仍将缓存该页面。要重新加载页面以供回溯历史,请使用no-store。IE需要重新验证才能在所有情况下正常工作。

因此,为了确保避免我经常使用的所有错误和误解

Cache-Control: no-store, no-cache, must-revalidate

如果我想确保它重新加载。


2

最初,我们在多年前使用无缓存,但在某些浏览器中确实遇到了过时内容的问题……不幸的是,请不要记住具体细节。

从那以后,我们就决定只使用无商店。从那以后,再也没有浏览器或中介机构对过时的内容进行回顾或处理过。

与各种RFC中所写的内容相比,此空间无疑是由实现的现实决定的。特别是许多代理倾向于认为通过用自己的策略替换本应遵循的策略,他们在“改进性能”方面做得更好。


我相信是Firefox以前更喜欢no-store
bvdb


-1

OWASP对此进行了讨论:

cache-control指令之间的区别是:no-cache和no-store?

响应中的no-cache指令指示不得将响应用于响应后续请求,即,高速缓存不得显示在标头中设置了该指令的响应,而必须让服务器为请求提供服务。no-cache指令可以包含一些字段名称;在这种情况下,可以从缓存中显示响应,但应从服务器提供服务的指定字段名称除外。no-store指令适用于整个消息,它指示高速缓存不得存储响应的任何部分或任何要求它的请求。

这些指令对我完全安全吗?

否。但是,通常,除了Expires:0(或具有足够回溯性的GMT日期(例如UNIX时代))外,请同时使用Cache-Control:no-cache,no-store和Pragma:no-cache。即使设置了上述缓存控制指令,非pdf内容类型(例如pdf,word文档,excel电子表格等)也经常会被缓存(尽管这会因版本而异,并且必须使用必须重新验证,pre-check = 0,post-check)实际上,由于浏览器的怪癖和HTTP实现,在某些情况下,= 0,max-age = 0和s-maxage = 0有时至少会导致关闭浏览器时删除文件。同样,“自动完成”功能允许浏览器缓存用户在表单输入字段中键入的内容。为此,表单标签或单个输入标签应包含“ Autocomplete =“ Off”'属性。然而,

来源在这里


这是不正确的。 no-cache说您不使用服务器验证就无法使用它。如果缓存的副本仍然良好,则服务器将回复304,然后您可以使用缓存的副本。为您节省了潜在的大量网络下载。 no-store另一方面说您根本不可以缓存数据。
石像鬼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.