问题描述
header("Content-Security-Policy: default-src 'self' https://apis.google.com https://www.googletagmanager.com https://fonts.googleapis.com https://use.fontawesome.com https://connect.facebook.net https://www.facebook.com");
我想允许来自所有这些网站的脚本。我尝试用 * 替换每个 url,比如 https://apis.google.com
到 *.google.com
,但结果是一样的。
我也尝试过使用 script-src
而不是 default-src
。
我认为这是为了允许来自某些网站的所有内容,但未加载该指令中包含的资源。例如,谷歌字体。它们只是无法加载,我看到的是系统字体,而不是 Google 字体。
我做错了什么?
检查控制台我收到此错误:
内容安全策略:页面的设置阻止加载 内联资源(“script-src”)。
解决方法
您已允许 'self' 这允许从同一来源的其他 URL 加载脚本。这是最有可能完全安全的来源,因为它不涉及第三方。
'self' 不包括内联脚本(需要 'unsafe-inline' 或 'unsafe-hashes' 选项) .
允许内联脚本最危险,因为它们是最有可能由 XSS 攻击创建的脚本类型。
进一步阅读:MDN
,整理好了。以防万一它对某人有帮助:
header("Content-Security-Policy: script-src 'strict-dynamic' 'unsafe-inline' http: https:;
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
report-uri https://apis.google.com https://www.googletagmanager.com https://fonts.googleapis.com
https://use.fontawesome.com
https://connect.facebook.net");
,
整理好了。以防万一它对某人有帮助:
script-src 'strict-dynamic' 'unsafe-inline' http: https:;
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
report-uri https://apis.google.com https://www.googletagmanager.com https://fonts.googleapis.com https://use.fontawesome.com https://connect.facebook.net
鉴于 CSP 有 2 fatal errors 并因此阻止任何脚本:
-
'strict-dynamic'
取消任何基于主机/基于方案的源和'unsafe-inline'
令牌(还有'self'
)。因此,它必须与'nonce-value'
或'hash-value'
配对,以便允许属于这些范围的脚本。
目前,在兼容 CSP3 的浏览器中,您会阻止所有脚本,因为生成的指令是script-src 'strict-dynamic'
不允许任何内容。 -
对于
require-trusted-types-for
指令,必须使用 Trusted Types API 为某些 XSS 易受攻击的 DOM 接收器赋值。因此该指令 JS constructs 所涵盖,如:element.innerHTML='...'
、document.write()
、createElement('script')
、parseFromString()
等在 Chrome 浏览器中被阻止(其他目前不支持可信类型 API)。
如果您希望使用“strict-dynamic”,请移除 require-trusted-types-for 'script';
指令并将 'nonce-value'
或 'hash-value'
添加到 script-src
中。在这种情况下,只允许具有 nonce="value"
及其子项的脚本。使用 'hash-value'
将允许执行具有此哈希及其子项的脚本(不要忘记外部脚本的完整性 = 属性)。
是的,删除 Quentin 提到的 report-uri
指令。 Google 和 Facebook 尚未准备好提供您的违规报告。