DISCOURSE_CDN_URL 导致内容安全策略违规?

我不知道自己是怎么搞砸的。我无法理解为什么只有我遇到了这个看似是 bug 的问题。

如果我在 ymlenv: 部分(针对相当标准的多站点配置)定义:

  DISCOURSE_CDN_URL: https://lcsupport-92e2.kxcdn.com

浏览器会因为 CSP 错误而拒绝所有 CDN URL。

content security policy script src 声称“额外的白名单脚本源。当前主机和 CDN 默认包含在内。参见 通过内容安全策略减轻 XSS 攻击。",但是当我定义它(或将其添加/移除到 discourse.conf 并执行 sv restart unicorn)时,我会得到以下错误:

即使将 content security policy report only 设置为 true,网站仍然无法加载。

看来必须关闭 content_security_policy 或将 CDN URL 添加到 content security policy script src,浏览器才能加载资源。

我的 yml 文件 在此

默认情况下,应计算 CDN 网址并将其包含在 CSP 中。您能否提供(或尝试对比)响应头中实际服务的 CSP 以及被阻止资源的来源?

这是头部信息:

content-security-policy-report-only: base-uri 'none'; object-src 'none'; script-src 'report-sample' 
https://support.literatecomputing.com/logs/ 
https://support.literatecomputing.com/sidekiq/ 
https://support.literatecomputing.com/mini-profiler-resources/ 
https://abedmulti-92e2.kxcdn.com/uploads/assets/ 
https://abedmulti-92e2.kxcdn.com/uploads/brotli_asset/ 
https://support.literatecomputing.com/extra-locales/ 
https://lcsupport-92e2.kxcdn.com/highlight-js/ 
https://lcsupport-92e2.kxcdn.com/javascripts/ 
https://lcsupport-92e2.kxcdn.com/plugins/ 
https://lcsupport-92e2.kxcdn.com/theme-javascripts/ 
https://lcsupport-92e2.kxcdn.com/svg-sprite/ 
https://www.google-analytics.com/analytics.js 
https://tagmanager.google.com/ 
https://www.googletagmanager.com/; worker-src 'self' blob:

以下是容器内的环境变量:

root@support-multi:/var/www/discourse# echo $DISCOURSE_S3_UPLOAD_BUCKET 
abed-multi/uploads
root@support-multi:/var/www/discourse# echo $DISCOURSE_S3_CDN_URL 
https://abedmulti-92e2.kxcdn.com/uploads

以下是 discourse.conf 中的 CDN URL:

cdn_url = 'https://lcsupport-92e2.kxcdn.com'

以及 Rails 中的信息:

[1] pry(main)> GlobalSetting.cdn_url
=> "https://lcsupport-92e2.kxcdn.com"

以下是其中一个无法加载的资源 URL:https://lcsupport-92e2.kxcdn.com/brotli_asset/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js

所以我们在 CSP 中有如下配置:

https://abedmulti-92e2.kxcdn.com/uploads/assets/ 
https://abedmulti-92e2.kxcdn.com/uploads/brotli_asset/
# 即 DISCOURSE_S3_CDN_URL + /brotli_asset/

但实际地址是:

https://lcsupport-92e2.kxcdn.com/brotli_asset/preload-store-d32dcf974dddcac742f8a7a6aa7fcd686185920b201029d0ecb2b85527ef9034.js
# 即 DISCOURSE_CDN_URL + /brotli_asset/...

相关 CSP 代码如下:

当可用时,我们优先使用 DISCOURSE_S3_CDN_URL 作为资源地址。这与 CDN 资源 URL 生成逻辑 一致。

@pfaffman 您的站点中 GlobalSetting.use_s3? 是否返回 true

我在想是否需要在其中增加一个 GlobalSetting.use_s3? 的检查。拥有 GlobalSetting.s3_cdn_url 是否一定意味着 GlobalSetting.use_s3? 为真?我现在对资源生成和 S3 CDN 这块有点模糊了 :sweat_smile: 能否请更熟悉这块的同事也帮忙看一下?谢谢!

嗯,我尝试了设置 use_s3 然后运行 rake assets:precompile,但没有任何变化。

我在其他地方也遇到过这个问题,当时对资源是存储在 S3 还是本地(或其 CDN 镜像)存在混淆。