我在heroku上部署了一个MERN应用程序,并为CSP设置了以下值:
<meta
http-equiv="Content-Security-Policy"
content="connect-src https://api.themoviedb.org 'self'; default-src 'self'; base-uri 'self'; object-src 'none'; script-src 'unsafe-inline' 'self' ; style-src 'unsafe-inline' 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com"
/>
然而,这是我在Chrome控制台得到:
拒绝连接到[URL],因为它违反了以下内容安全策略指令:“default-src 'self'”。请注意,未显式设置“connect-src”,因此将“default-src”用作回退。
为什么它告诉我connect-src没有设置,而我在检查页面时可以在index.html中看到它?
2条答案
按热度按时间dkqlctbz1#
不幸的是,标记为“正确答案”的answer,是完全错误的,并提供了误导性的信息。
<meta http-equiv="Content-Security-Policy>
meta标记不被视为传统标记。在某些情况下, meta标记是将策略传递到页面的唯一方式。
1.最佳做法是将default-src作为第一个指令。
废话,CSP中的指令顺序没有任何意义,而且Google的strict CSP根本没有
default-src
指令。1.问题作者的问题是
node.js
在依赖项中包含了Helmet中间件。Helmet v4发布了一个没有connect-src
指令的default CSP HTTP header。这就是为什么问题作者观察下面的消息:
拒绝连接到[URL],因为它违反了以下内容安全策略指令:“default-src 'self'"。请注意,未显式设置**”connect-src“,因此”default-src“将用作回退**。
请注意这不是来自元标记的CSP规则,而是Helmet中间件的默认CSP规则。
通过 meta标记添加第二个CSP来缓解该默认CSP失败,因为同时应用了2个CSP-所有源都应通过这两个CSP。
所以有两个选择:
helmet.contentSecurityPolicy()
并使用元标记来提供CSP。connect-src
规则添加到helmet.contentSecurityPolicy(options)
中。2uluyalo2#
CSP有一些版本(或级别),其中新支持的功能扩展了原始规范。通过html meta标头提供CSP被认为是传统的,并且有一些缺点。尝试通过请求的HTTP标头设置CSP此外,作为最佳实践,请首先使用
default-src
指令。