在没有服务器端渲染(cookie)的情况下使用 CSP 随机数

Use CSP nonce without server side rendering (cookie)

构建具有分离的前端和后端(无服务器端渲染)的 Web 应用程序时 I still want to make use of CSP nonce。通常 CSP header 和 html 应该包含相同的随机数,这对 SSR 没有问题,但如果没有 SSR 似乎是不可能的。

现在我想到了一种不用 SSR 来使用 nonce 的不同方法:

const script = document.createElement('script')
script.setAttribute('src', 'https://example.com')
script.setAttribute('data-csp-nonce', getCspNonceFromCookie())
document.head.appendChild(script);

这是解决这个问题的有效方法吗?是否存在安全问题?

您的解决方案有效。我的一个项目以类似的方式进行。但是你应该设置一个 nonce 属性而不是 data-csp-nonce.

script.setAttribute('nonce', 'THE-GENERATED-NONCE')

因此脚本标签如下所示:

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

只有当服务器发送的 headers 已经包含拒绝外部脚本的 content-security-policy 时,这才是安全的。例如:

content-security-policy: default-src 'self'; script-src 'self' 'nonce-jETnT70lr0T3Hw4b5WeCjuJ421a3kcBl'; img-src 'self' data:; object-src 'none'