【发布时间】:2021-07-21 15:35:45
【问题描述】:
我有一个使用 Workbox 支持的服务工作者用 Angular 编写的单页应用程序。静态应用程序文件使用包含随机数的 Content-Security-Policy 标头提供。包含<script> 标签的静态应用文件(例如index.html)用随机数属性(<script nonce="FCNjs05n4eQdfn39fn3c9h5segb">)修饰。
由于 nonce 值不得多次使用,我假设 Service Worker 应该通过修改从预缓存。因此,当向index.html 发出请求时,Service Worker 应该生成一个 nonce,修改 CSP 标头的 script-src 指令以包含新的 nonce,并且 index.html 必须将所有 nonce="" 属性更新为新的 nonce也是。
我认为这是必要的,因为重复使用相同的 nonce 值可能会带来安全风险;但是,我不确定这一点,因为对于这种特定情况没有明确的安全建议。我找到了一个代码示例,其中作者演示了使用当前日期和请求的文件名在 Service Worker 中生成一个新的随机数(我的推理是不安全的,因为它不使用加密强的伪随机字节)。
还应该注意的是,我不能使用哈希,因为我遇到了 Mozilla Firefox 和 Safari 的障碍。 Firefox 只会计算内联脚本标签内容的哈希值并将其与 Content-Security-Policy 标头中的哈希值进行比较。外部 JavaScript 源(例如 <script src="js/foo.js"></script>)的哈希值是不计算的,并与您放入 CSP 标头中的哈希值进行比较。这使构建安全应用程序变得复杂,因为它需要我依赖不同的安全机制(随机数),这反过来又要求我在我的服务器和服务工作者中采取额外的步骤来在标头和交付的内容中轮换这些随机数。
【问题讨论】:
标签: javascript security service-worker content-security-policy workbox