HTTP Content-Security-Policy Nonce 和缓存

信息安全 http javascript 内容安全策略 缓存
2021-08-19 18:04:23

这里有没有人能够澄清缓存如何影响向nonce=value所有内联javascript添加a?

如果 nonce 必须是唯一且不可预测的,则需要禁用使用<script nonce="XXXXX">. 正确的?

有关详细信息,请参见此处的示例 4

3个回答

如果 nonce 必须是唯一且不可预测的,则需要禁用使用 <script nonce="XXXXX"> 的页面上的所有服务器端(即 Varnish、Cloudfront 等)缓存。正确的?

是的。您总是必须禁用任何动态生成的缓存(即来自脚本)。由于您无法静态提供唯一且不可预测的随机值,因此必须通过脚本完成。

这可以由应用程序服务器愉快地缓存数天,而不会对 CSP 随机数保护产生负面影响。

不,nonce 对于每个请求都应该是唯一的(nonce = 使用一次的数字)。

我想唯一的解决方案是对包含 nonce 的脚本标签使用非缓存 SSI(服务器端包括),并将其与响应内容安全标头中的 nonce 或元 http-equiv="Content 的另一个小 SSI -安全策略”-标签。

这将使每个页面都是唯一的,因此不可缓存。

这取决于我们正在谈论的服务器端缓存,因为这通常有很多层。如果您的应用程序服务器正在缓存 HTML 以节省昂贵的 SQL 查询和模板处理,那么您仍然可以通过在返回的途中修改输出 HTML 来使用 nonce。您的模板以及生成的 HTML 可能包含如下占位符:

<script nonce="CSP_NONCE_PLACEHOLDER">
...
</script>

可以由应用程序服务器愉快地缓存数天,而不会对 CSP 随机数保护产生负面影响。

然后在Web 服务器上动态生成 nonce并替换上述占位符而不使缓存值过期:

<script nonce="ee4183bb7784017e0ab7d38ab7ef9eb3a75190e0e76ca5daba8cd20104bd8131">
...
</script>

多年来,我一直在webcookies.org 上使用 Web 应用程序在 Django 上运行,缓存在 Redis 中,Web 服务器是 Nginx。对于后者,有两种选择:

    sub_filter_once off;
    sub_filter CSP_NONCE_PLACEHOLDER $ssl_session_id;