Gatsby 内容安全策略

Posted

技术标签:

【中文标题】Gatsby 内容安全策略【英文标题】:Gatsby Content-Security-Policy 【发布时间】:2021-10-13 18:23:18 【问题描述】:

我使用default starter 创建了一个新的 gatsby 项目。创建项目后我所做的就是 npm install gatsby-plugin-csp plugin 并在 gatsby-config.js 中添加配置,如下所示:


  resolve: `gatsby-plugin-csp`,
  options: 
    disableOnDev: false,
    reportOnly: false, // Changes header to Content-Security-Policy-Report-Only for csp testing purposes
    mergeScriptHashes: false, // you can disable scripts sha256 hashes
    mergeStyleHashes: false, // you can disable styles sha256 hashes
    mergeDefaultDirectives: true,
    directives: 
      "script-src": "'self' 'unsafe-inline' www.google-analytics.com",
      "style-src": "'self' 'unsafe-inline'",
      "img-src": "'self' data: www.google-analytics.com"
    
  
,

但是,当我运行 npm run develop 并加载 localhost:8000 时,我在控制台中遇到以下错误以及空白页面:

未捕获的 EvalError:拒绝将字符串评估为 javascript,因为 'unsafe-eval' 不是以下允许的脚本来源 内容安全策略指令:“script-src 'self' 'unsafe-inline' www.google-analytics.com”。

at Object../node_modules/@pmmmwh/react-refresh-webpack-plugin/client/ReactRefreshEntry.js

(commons.js:404) 在 Object.options.factory (commons.js:4439) 在 webpack_require (commons.js:3811) 在 commons.js:5147 在 Function.webpack_require.O (commons.js:3860) 在 commons.js:5150 在 commons.js:5152

当我将 'unsafe-eval' 添加到 script-src 时,页面加载正常,但这当然不安全。

如果可能,我需要进行哪些配置更改才能在不使用 'unsafe-eval' 甚至 'unsafe-inline' 的情况下加载页面?

【问题讨论】:

【参考方案1】:

我读到这个错误,react-refresh-webpack-plugin 由于 CSP 而无法运行。 react-refresh-webpack-plugin 仅在开发期间使用。

最好的办法是在gatsby-plugin-csp 的选项中设置disableOnDev: true。这是不言自明的,但这只会禁用开发中的 CSP ($ gatsby develop)。要在本地测试 CSP,只需执行 $ gatsby build$ gatsby serve

【讨论】:

以上是关于Gatsby 内容安全策略的主要内容,如果未能解决你的问题,请参考以下文章

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过

Spring Security配置内容安全策略

Spring Security配置内容安全策略