添加脚本到主题组件时的CSP错误

Atlassian Widget 的 Strict Dynamic 和 CSP 问题

更新到 v3.3.0.beta1 后,我在使用内容安全策略 (CSP) 时遇到了一个问题。具体来说,我正尝试在容器的头部嵌入一个 Atlassian 小部件,该容器是在此次更新之前创建的。

这是我添加到头部的内容:

<script data-jsd-embedded nonce="{{content_security_policy_nonce}}" data-key="bla" data-base-url="https://jsd-widget.atlassian.com" src="https://jsd-widget.atlassian.com/assets/embed.js"></script>

我已确保包含 nonce,但遇到了以下错误:

embed.js:1 Refused to set the document's base URI to 'https://jsd-widget.atlassian.com/' because it violates the following Content Security Policy directive: "base-uri 'self'".

embed.js:1 Refused to load the script 'https://jsd-widget.atlassian.com/assets/iframe.js' because it violates the following Content Security Policy directive: "script-src 'nonce-YAnMdLzmoWqLis3WXiQKjxdHk' 'strict-dynamic'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.

此外,我在之前的帖子中看到一个建议,可以通过以下方式动态加载脚本:
javascript

var s = document.createElement('script');
s.src = "https://jsd-widget.atlassian.com/assets/embed.js";
document.body.appendChild(s);

但这似乎并没有解决问题。我显然对 strict-dynamic 在此上下文中的工作方式有所误解。

有人能帮我理解为什么会发生这些错误以及如何解决它们吗?任何指导都将不胜感激!

3 个赞

有趣的是,我正好在查看一个几乎相同的问题。

我可以在最近重新构建的最新版本上重现类似的问题。

我收到以下信息:

[仅报告] 拒绝加载脚本“https://www.mytestsite.com/mini-profiler-resources/includes.js?v=116e2a6fd81c286e004e2a0afb03baa1”,因为它违反了以下内容安全策略指令:“script-src 'nonce-ZSPIEwDBo6e07GuQMDkOFZerD' 'strict-dynamic'”。请注意,'script-src-elem' 未明确设置,因此 'script-src' 被用作回退。
3 个赞

你们有谁能分享一个显示此问题的网站链接吗?我很乐意快速查看一下 :eyes:

如果你是通过主题组件添加的,那么你应该删除 nonce= 部分。Discourse 会自动添加它(我认为你自己添加它可能会破坏自动系统)。

3 个赞

就此问题进行总结 - @merefield 和我通过私信讨论了这个问题,并将其追溯到一个仅报告特定的问题。修复方案在此:FIX: Mini-profiler CSP nonce when in report-only mode by davidtaylorhq · Pull Request #28664 · discourse/discourse · GitHub

所以这看起来与 @devops1 遇到的问题不同。

4 个赞

你好大卫,非常感谢。
感谢您的快速回复。

我正在添加的代码是
<script data-jsd-embedded data-key="bla" data-base-url="https://jsd-widget.atlassian.com" src="https://jsd-widget.atlassian.com/assets/embed.js"></script>

我已按要求删除 nonce。

这是网站 https://onlinecommunity.stroke.org.uk/
我已经启用了内容安全策略报告模式。

2 个赞

主题组件是否已启用?我在开发者工具中查看时没有看到任何 Atlassian 脚本。

1 个赞

我想现在应该可以了,我在页面源代码中找到了脚本。

2 个赞

embed.js 脚本似乎运行成功,因此 Discourse 部分工作正常。

但是,它随后尝试创建一个同源 iframe,其中包含“parser-inserted”脚本标签。这种策略与严格的动态 CSP 不兼容。

所以我认为这是 Atlassian 需要修复的问题。我在他们的跟踪器上发现了这个问题,它似乎相关(尽管没有太多细节或解决方案 :cry:)。

2 个赞

非常感谢您帮我调查这个问题,David。

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.