在 nginx 中使用带有 nonces 的 CSP 时进行客户端缓存 - 如何使用弱缓存验证器/etags?

在 nginx 中使用带有 nonces 的 CSP 时进行客户端缓存 - 如何使用弱缓存验证器/etags?

我在用着nginx 的expires指令; 它是etag指示以及Last-Modified标题(如果我理解正确的话)默认处于开启状态。

为了在使用限制性内容安全策略 (CSP)标题(即没有'unsafe-inline'资源策略)我想使用随机数。

我基本上遵循了Scott Helme 就此事撰写的文章,在我的试用版中使用 nginx$request_id创建nonce 就像在 ServerFault 上讨论的那样(为了快速尝试这一点,而不必从头开始构建 nginx)。

然而,当我尝试这样做时,似乎缓存不再像我预期的那样工作:
Nginx 每次都以文件、新鲜内容Last-ModifiedETag标头进行响应,而不是304 Not Modified我所希望的响应。

仔细想想,这是有道理的:nonceCSP 标头以及源代码中的 会随着每个请求而变化。但是,其他内容没有变化。因此,可以说,这是一个变化“弱验证器”应该忽略(从而将请求的资源标记为不是已更改)。

话虽如此,我对服务器配置或缓存标头知之甚少。我所掌握的知识可能没有帮助,而且弱验证器本来就不应该那样工作。

此外,似乎浏览器混淆的问题当他们拥有一个带有旧文件的缓存版本nonce但却获得了304 Not Modified一个带有新文件的标题nonce时(虽然我在试用中没有亲自看到过这种情况)。

我的问题基本上是:是否可以配置 nginx,以便缓存以某种方式工作,改变nonce唯一(即通过文本替换动态发生的更改)当 nginx 创建Last-ModifiedETag标头时将被忽略(即它只查看磁盘上的文件更改) - 有效地使用可能很弱的验证器?

并且,假设浏览器混淆是一个问题,你能做些什么来阻止它吗,比如当服务器返回 304 时不返回 CSP 标头(以免用与“文件”不匹配的新标头替换浏览器的“标头”随机数)?(这更像是一个学术问题;我想我可以尝试不为响应设置 CSP 标头304,也许使用ngx_headers_more模块

我是否真的可以选择使用 nonce 或缓存?或者这应该开箱即用(我看到的一切都归因于其他原因)?

相关内容