Html 包含CSP nonce的服务器端呈现页面的ETag

Html 包含CSP nonce的服务器端呈现页面的ETag,html,express,browser-cache,content-security-policy,etag,Html,Express,Browser Cache,Content Security Policy,Etag,我有一个服务器端的应用程序和Node/Express,到目前为止,它们能够生成正确、稳定的,允许利用客户端缓存 此外,生成的HTML包含渲染块(折叠上方)CSS和JS片段,作为和标记内联,用于更快的客户端首次渲染(由及其PageSpeed和Lighthouse工具推广) 现在我想启用并提供一个nonce作为每个页面请求上的和标记的属性,以避免不安全的内联冲突。然而,不断变化的nonce也会使ETag在每次请求时都发生变化。HTML永远不会被缓存,每个请求都会命中我的Express服务器 是否有一

我有一个服务器端的应用程序和Node/Express,到目前为止,它们能够生成正确、稳定的,允许利用客户端缓存

此外,生成的HTML包含渲染块(折叠上方)CSS和JS片段,作为
标记内联,用于更快的客户端首次渲染(由及其PageSpeed和Lighthouse工具推广)

现在我想启用并提供一个
nonce
作为每个页面请求上的
标记的属性,以避免
不安全的内联
冲突。然而,不断变化的nonce也会使ETag在每次请求时都发生变化。HTML永远不会被缓存,每个请求都会命中我的Express服务器

是否有一种同时合并的方法:

  • 内联CSS和JS
  • CSP功能(即
    nonce
    或类似功能)
  • ETag或替代品
?

到目前为止,我发现当前的性能与安全准则之间存在矛盾

是否有CSP nonce的等价物,或者可以在保持HTML完整的同时提供CSP nonce?有没有办法缓存包含CSP nonce的页面


理想情况下,我希望在Express server中包含一个解决方案,而不必修改我的反向代理配置,但任何选项都是受欢迎的。

一个解决方案是将整个内容生成和缓存留给web应用程序(在您的情况下是节点),将CSP nonce生成留给前端web服务器(例如Nginx)。我已经用Django实现了它,Django使用
ETag
进行页面缓存,所有
是否改变了
标题逻辑等,它生成的HTML包含这样一个静态CSP nonce占位符:

< script nonce="+++CSP_NONDE+++"> ... </script>
我见过一些解决方案使用额外的Nginx模块为每个请求生成一个真正唯一的随机nonce,但我认为这是一种过分的做法,我只是使用了TLS会话标识符,它在每个连接的客户机上都是唯一的,并且可能会缓存一段时间(例如10分钟),具体取决于您的Nginx配置


只要确保web应用程序返回未压缩的HTML,因为Nginx将无法进行字符串替换。

我认为使用哈希而不是nonce将是处理此问题的方法。@KevinChristopherHenry谢谢。事实上,
scrpt src'-'
可能是一条出路。你知道CSP散列和其他散列相比如何吗?浏览器支持怎么样?让现在的一切都过去有点可怕。当然,这是一个安全性/性能的权衡。我对浏览器支持没有任何特别的见解,但显示它与nonce(即CSP 2.0的一部分)具有相同的支持。我看不出任何安全方面的缺点,加密哈希非常安全(也就是说,攻击者插入另一个具有相同哈希值的内联脚本是不可行的),建议使用nonce(隐式优先于散列),但解释了如何在无法使用nonce的情况下使用散列。但也请参见,其中包含一些关于使用nonce的警告。@sideshowbarker捕捉得好!到目前为止,似乎最好同时使用哈希和nonce。这意味着ETAG正在失去基础。也许我只是去掉了它们,为Express:)提供了更多的compute:
来添加另一个参数来保护nonce:当脚本内容是动态的()时,不能使用哈希。动态脚本内容在很多方面都是错误的,我没有,但谁知道呢,也许它们有它们的有效用例。
sub_filter_once off;
sub_filter +++CSP_NONCE+++ $ssl_session_id;
add_header Content-Security-Policy "script-src 'nonce-$ssl_session_id'";