内容安全策略问题节点 js 反应

Posted

技术标签:

【中文标题】内容安全策略问题节点 js 反应【英文标题】:Content Security Policy issue node js react 【发布时间】:2021-03-17 06:11:52 【问题描述】:

我正在用 node js 开发一个 react 项目。我的 index.html 中有两个外部源

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>

除了我有一个仍然由于 CSP 导致的服务器的发布请求之外,连接失败。 post请求失败是:

Refused to connect to 'localhost:3000/visitor' because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'connect-src' was not explicitly set, so 'default-src' is used as a fallback.

对于外部链接,我收到了一些关于内容安全政策的错误,我在下面展示了其中一个。

拒绝加载脚本“https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js”,因为它违反了以下内容安全策略指令:“script-src”自己'”。请注意,'script-src-elem' 没有显式设置,因此 'script-src' 用作备用。

我做了两种策略,但都没有解决我的问题: 1- 元数据通过:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;">

在 index.html 中的所有脚本标签之上,基本上可以打开以通过脚本标签加载任何类型的外部文件,但我仍然在浏览器中遇到相同的错误,并且此类 js 文件没有加载到我的应用程序中

2- 在我的节点 js 中,我使用了头盔模块,如下所示:

app.use(helmet(

  contentSecurityPolicy: false,

));

我应该怎么做才能解决这个让应用程序无法正常工作的愚蠢问题?谢谢

【问题讨论】:

【参考方案1】:

我做了两种策略,但都没有解决我的问题:1- 元数据 路过:

<meta http-equiv="Content-Security-Policy" content="...">

内容安全策略可以通过 2 种方式传递:HTTP 标头和&lt;meta&gt;。您有一个通过 HTTP 标头的限制性 CSP,并通过 &lt;meta&gt; 添加了第二个。 2 个 CSP 作为 2 个后续过滤器工作,只允许通过两个过滤器。因此,&lt;meta&gt; 不允许除了标头的 CSP 之外的任何内容。您需要向第一个 CSP 添加源,而不是 &lt;meta&gt;,如下所示:

app.use(
  helmet(
    contentSecurityPolicy: 
      directives: 
        defaultSrc: ["'self'"], 
        scriptSrc: ["'self'", "'unsafe-inline'",  'https://ajax.googleapis.com', 'https://stackpath.bootstrapcdn.com'],
        styleSrc: ["'self'"],
        imgSrc: ["*", 'data:'],
        connectSrc: ["'self'"],
        frameSrc: ["'self'"],
      ,
    
  )
);

此解决方法将有助于解决第二条错误消息。

2- 在我的节点 js 中,我使用了头盔模块,如下所示:

app.use(helmet(
  contentSecurityPolicy: false,
));

这完全关闭了 CSP 标头,因此有助于避免 Refused to load the script 'https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js' ... 错误。

但第一个错误Refused to connect to 'localhost:3000/visitor' because it violates the following Content Security Policy directive: "default-src 'self'" 仍然存在。 发生这种情况是因为您在服务器上没有localhost:3000/visitor URL 的路由,因此您会收到 404 Not found 错误。

NodeJS finalhandler 为错误页面提供服务,为了安全起见,它有自己的 CSP default-src 'self',因此您在 CSP 中观察到错误,而不是您管理。 为/visitor URL 建立正确的静态路由,这个错误就消失了。

【讨论】:

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

是否有可能使用 Next.js + Styled-Components 和静态主机(例如 S3)制定有意义/安全的内容安全策略

内容安全策略拒绝连接到 Websocket 错误

Wordpress 内容安全策略问题

内容安全策略:页面的设置阻止了资源的加载

Gatsby 内容安全策略

内容安全策略 [错误] 拒绝加载脚本 safari