如何解决Service Worker 返回包含 nonce 的缓存 CSP 标头是否安全?
我有一个使用 WorkBox 驱动的 Service Worker 用 Angular 编写的单页应用程序。静态应用文件带有一个包含随机数的 Content-Security-Policy
标头。包含 index.html
标签的静态应用文件(例如 <script>
)使用 nonce 属性 (<script nonce="FCnjs05n4eQdfn39fn3c9h5segb">
) 进行修饰。
由于 nonce 值不能被多次使用,我假设 Service Worker 应该通过修改从预缓存。因此,当向 index.html
发出请求时,Service Worker 应该生成一个 nonce,修改 CSP 标头的 script-src
指令以包含新的 nonce,并且 index.html
必须具有所有 {{1 }} 属性也更新为新的随机数。
我认为这是必要的,因为重复使用相同的 nonce 值可能会带来安全风险;但是,我不确定这一点,因为没有针对此特定场景的明确安全建议。我找到了一个代码示例,其中作者演示了使用当前日期和请求的文件名在 Service Worker 中生成一个新的随机数(我的推理是不安全的,因为它不使用加密强伪随机字节)。
还应该注意的是,我不能使用哈希,因为我在使用 Mozilla Firefox 和 Safari 时遇到了障碍。 Firefox 只会计算内联脚本标签内容的哈希值并将其与 nonce=""
标头中存在的哈希值进行比较。外部 JavaScript 源(例如 Content-Security-Policy
)的哈希值不计算并与您放入 CSP 标头中的哈希值进行比较。这使构建安全应用程序变得复杂,因为它需要我依赖不同的安全机制(随机数),这反过来又要求我在我的服务器和服务工作者中采取额外的步骤来在标头和交付的内容中轮换这些随机数。
解决方法
主要问题不在于生成 nonce 的安全性,而在于无法应用 service worker 生成的 nonce(至少我没有看到)。
据我所知,缓存页面不会存储 HTTP 标头,因此当从缓存中恢复页面时,将忽略 CSP HTTP 标头。将元标记添加到缓存页面中(如果技术上可行的话)会导致它只交付一个 CSP,因此它应该可以按预期工作。
另一方面,如果您添加/删除/更改 <meta http-equiv='Content-Security-Policy' content=''>
元标记,浏览器会记住并应用所有以前的策略,请参阅测试。因此,您一次只能拥有多个 CSP。
您需要重新加载页面以清除浏览器“内存”,这是 SPA 与 CSP 的主要问题。
但是通过脚本修改缓存页面时的浏览器行为,需要另外检查。 AFAIK 有一种方法可以通过缓存页面绕过 CSP 和 nonce。
更新
在某些情况下,您可以对 Firefox 和 Safari 中的外部脚本哈希使用变通方法。您可以使用内联脚本加载外部脚本,如下所示:
var external = document.createElement("script");
external.src = "http://example.com/script.js"
external.setAttribute("type","text/javascript");
document.head.appendChild(external);
var external2 = document.createElement("script");
external2.src = "http://example.com/script2.js"
external2.setAttribute("type","text/javascript");
document.head.appendChild(external2);
上面的内联脚本可以通过 'hash-value'
与 'strict-dynamic'
配对使用(它是 Google 的 strict CSP 的变体):
script-src 'sha256-hash_of_inline_script' 'strict-dynamic' https:
'strict-dynamic'
令牌确实允许加载由合法内联脚本加载的任何脚本。
Safari 不支持 'strict-dynamic'
,因此它将使用 https:
方案源来允许外部脚本。
Chrome 和 Firefox 确实支持 'strict-dynamic'
,因此 https:
将被忽略。
是的,Safari 用户的安全性会降低,但您可以使用真实的主机源 (https://example.com https://CDN.com
) 而不是 http:
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。