理解/使用CSP、iframe和ancestors

我们在 site1 上安装了 Discourse。我们拥有/管理 site2.tld,并希望通过那里的页面中的 iFrame 访问论坛。我不太懂 CSP 的技术,所以很希望能得到帮助。

我不想禁用祖先限制,但暂时,我取消了 frame ancestor CSP 的勾选:

image

到目前为止的 HTML 是:

<iframe
  style="position:absolute;width:100vw;height:100vh"
  src="https://forum.site1.tld">
</iframe>

这仍然导致:

Firefox 无法打开此页面

为保护您的安全,forum.site1.org 不允许 Firefox 显示该页面(如果其他网站已将其嵌入)。要查看此页面,您需要在新窗口中打开它。

我查看了嵌入(Embedding),但该功能似乎有不同的用途。我们不想限制到单个主题,并且用户将不会登录。最初,如果用户不登录并且整个论坛都可以只读访问,那也是可以的。

有什么建议吗?有什么问题吗?

谢谢!

有人将他们的 site1 Discourse 嵌入到他们的 site2 中吗?谢谢!

我们不建议,也不测试,通过 iframe 将 Discourse 完全嵌入另一个网站。

相反,我们建议每个网站使用自己的域名,通过链接、单点登录和样式化 Discourse 来匹配您主站点的视觉效果。

2 个赞

好的。谢谢!

了解长期后果,我们暂时禁用了 CSP,但仍然收到来自 Firefox 的 CSP 警告。需要重启吗?

这是应用程序/挑战。也许有一个简单的解决方案……

有一个 Discourse 服务器,并且像往常一样,有任意数量的用户帐户和访客。注册用户有一个托管本地 Web 服务器的应用程序。在该应用程序中创建一个网页,并通过 http://192.168.1.1:8080 从本地浏览器访问该网页。该网页通过 IFrame 提供论坛。

我们无法控制提供内容的子网,因此 IP 可能来自任何常见的 NAT/DHCP。但我们对以下内容拥有完全控制权:

  • Discourse 安装和服务器。
  • 提供的内容。
  • 端口号通常是 8080,用户可配置,但永远不会是 80 或 443。
  • 由于这是本地内容且非关键任务,因此不进行 SSL 安全保护。
  • 用户必须拥有 Discourse 帐户,并且必须登录 Discourse 才能进行写入访问。

关于安全性:

  • 公共论坛可通过主机名在网络上访问。
  • 网络访问当然始终是 SSL 安全的。
  • 除非登录,否则没有人可以创建论坛内容。
  • 所以是的,带有 IFrame 的本地页面以 HTTP 形式提供:但 IFrame 源是 HTTPS://forum.site.tld。(这种协议差异可能是导致即使禁用 CSP 也无法访问论坛的原因。)
  • 用户启动浏览器以访问本地服务器后,必须输入密码。如果需要,我们可以启用该页面进行 SSL,以保持该父页面与 SSL 启用的论坛站点的 IFrame 之间的一致性。
  • 我们没有也不打算通过 IFrame 脚本化 Discourse。我们只想在容器中托管论坛。

以下是一些可能毫无价值的随机想法:

  1. 允许用户从其 Discourse 帐户页面获取 API 密钥,然后将其放入应用程序中,该应用程序随后将通过 cookie 或其他方式传递给 Discourse。这证实了尽管用户不符合 CORS 或 CSP 标准,但他们有权访问资源。
  2. 让应用程序将令牌注入 IFrame URI 到 Discourse。同时使用 API 调用让 Discourse 允许使用该令牌进行入站连接。(是的,这需要编码)
  3. 变得更糟糕……在社区站点上创建一个页面,该页面打开一个 IFrame 来显示子网内容,以及另一个 IFrame 来显示论坛。这个站点可以被授权进行跨源访问。
  4. 放弃绕过策略的尝试,并使用 target=window 在应用程序窗口外部打开 Discourse。

在不立即诉诸选项 4 的情况下……有什么想法吗?谢谢!