0

如果不包括脚本和样式的 unsafe-inline,则无法应用内容安全策略。NuxtJS 在构建时生成内联样式和脚本。

由于我的应用程序是静态的,因此 NuxtJS 的默认配置不起作用,因为它需要服务器端渲染来实现这一点。我还没有找到一种方法将 nonce 注入构建过程来解决这个问题。

我当前的设置是将安全 HTTP 标头应用于域,该域使用不接触应用程序的 cloudflare 工作者。因此,我正在寻找如何在应用程序和边缘工作者之间集成它的选项https://scotthelme.co.uk/csp-nonces-the-easy-way-with-cloudflare-workers/

在浏览我无法工作的 nuxtjs github 问题时,遇到了几种使用中间件的注入方法。

有没有人找到一种解决方案来生成不包括 unsafe-inline 的策略,直接在应用程序中或外部?

4

1 回答 1

0

NuxtJS 在构建时生成内联样式和脚本。...我一直无法找到将随机数注入构建过程以解决此问题的方法

从 CSP 的角度来看

  • 3 种类型的内联脚本,使用“nonce-value”可能只允许其中一种
  • 内联样式有3 种类型(包括.setAttribute()函数的 JS 调用 - 是的,style-src 中也需要 'unsafe-inline'),并且只能使用 'nonce-value' 允许其中一种。

因此,以抽象的形式,你的任务是不可解决的,你需要细节。

假设您只使用<script>...</script>and<style>...</style>构造(这些可能允许使用 'nonce-value'),您有 3 个选项:

  1. 使用“随机值”
  2. 使用“哈希值”
  3. 将脚本/样式放入外部文件并使用“自我”

在使用document.createElement('style')的情况下,选择 1 更可取,您只需设置style.nonce = 'generated_base64_value'属性。因为在这种情况下计算“哈希值”并不容易。

在使用情况下,<script>...</script><style>...</style>容易计算哈希或将所有内容移至外部文件(选项 2、3)。在这种情况下,使用 cloudflare worker 会使代码不必要地复杂化。

一些中间件会生成很多单独<style>.red {color:red;}</style>的 ,<style>.r_padd {padding-right:20px;}</style>等。这对 opts 1、2 来说是一个令人头疼的问题,但通过 opt 3 很容易解决。

如果您使用第三方脚本,例如 Google 跟踪代码管理器,则无法摆脱“unsafe-inline”脚本,在某些情况下也无法摆脱“unsafe-eval”。

PS:没有通用的方法。而且不知道汽车引擎盖下有什么,很难就如何加力提供建议。

于 2020-10-24T12:36:05.807 回答