【问题标题】:React CRA with CSP: Refused to execute inline script用 CSP 反应 CRA:拒绝执行内联脚本
【发布时间】:2020-08-25 17:02:17
【问题描述】:

我已经使用Material UI Create React Template 建立了一个新网站。

我添加了内容安全策略,成功构建并部署,但是页面未显示在浏览器中,并且收到以下错误:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self'”。启用内联执行需要使用“unsafe-inline”关键字、哈希(“sha256-mB4hl8euSw00eXDUIRf8KeqpMfBXgg0FILGScPTo+n0=”)或随机数(“nonce-...”)。

我没有任何内联脚本。

当我将指定的哈希添加到我的内容安全策略中时,网站可以运行,但如果我再次部署,哈希会更改,我需要使用新的哈希更新我的内容安全策略。

哈希从何而来,是否可以避免在部署期间每次都需要手动更新哈希?

【问题讨论】:

标签: reactjs material-ui content-security-policy


【解决方案1】:

感谢您迄今为止的帮助。我已经找到了这个问题的答案,所以我会分享它,希望它可以帮助其他人。

根据 Create React App 文档中的Advanced Configuration section

默认情况下,Create React App 会在生产构建期间将运行时脚本嵌入到 index.html 中。

这似乎是动态构建脚本的来源。

文档进一步建议INLINE_RUNTIME_CHUNK=false 标志应包含在.env 文件中以避免嵌入脚本。

通过在.env 文件中包含INLINE_RUNTIME_CHUNK=false 标志、重建和部署,我能够解决问题。

【讨论】:

  • 你在哪里包含了 .env 文件?在我的文件结构中,我有两个文件夹:后端和前端,我在根目录中有 .env 文件,但它不起作用!
【解决方案2】:

Googletagmanager 将内联脚本添加到您的页面。除非您按如下方式进行设置,否则您将无法使用 googletagmanager 强制执行严格的 script-src(没有 unsafe-inline):https://developers.google.com/tag-manager/web/csp

您还可能需要处理其他动态构建的脚本。

【讨论】:

  • 是的,我认为还有其他动态构建的脚本正在生成哈希。关于如何处理它们的任何想法?
  • 您首先需要决定是否要保留或修改 googletagmanager 的调用。如果您不打算提供随机数,则需要允许 unsafe-inline。然后你应该识别内联脚本,看看它们来自哪里。然后你需要修复它们,如果可能的话插入随机数或动态哈希。如果它是一个创建脚本标签的旧框架,你可能不走运......
猜你喜欢
  • 2020-02-12
  • 2014-07-14
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2023-03-30
  • 2020-03-02
  • 2016-07-19
相关资源
最近更新 更多