将 Facebook Checkbox 插件用作 iframe 小部件时出现 CSP 错误

Posted

技术标签:

【中文标题】将 Facebook Checkbox 插件用作 iframe 小部件时出现 CSP 错误【英文标题】:CSP error when using Facebook Checkbox plugin as an iframe widget 【发布时间】:2020-01-23 18:11:54 【问题描述】:

我正在尝试构建其他网站可以通过 iframe 包含的小部件。该插件包含Facebook Checkbox Plugin。

考虑 iframe 的以下代码:

<!DOCTYPE html>
<html>

<head>
<script>
  window.fbAsyncInit = function() 
    FB.init(
      appId            : '3297885870227646',
      autoLogAppEvents : true,
      xfbml            : true,
      version          : 'v4.0'
    );
  ;

</script>
<script async crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js"></script>


<body>
    <div class="fb-messenger-checkbox"
      origin="https://fb-marketing-widget.herokuapp.com/widget-iframe"
      page_id="110054573751247"
      messenger_app_id="3297885870227646"
      user_ref="<%= userRef %>"
      allow_login="true"
      size="standard"
      skin="light"
      center_align="true">
    </div>
</body>
</html>

直接在浏览器中打开 iframe URL 时,上述代码有效。但是,当我在具有不同域的另一个网站中包含相同的 iframe 时,我会因为祖先违反以下内容安全政策而被拒绝在框架中显示 'https://www.facebook.com/v4.0/plugins/messenger_checkbox.php?...指令:“框架祖先https://my-iframe-domain.com”。

请注意,iframe 在直接打开时可以正常工作,因此这显然不是将域列入白名单、应用程序 ID 错误等问题。

任何关于我如何将上述代码作为 iframe 包含在其他网站中的意见将不胜感激!

【问题讨论】:

我认为这是不可能的。该 CSP 指令的名称是 frame-ancestors,而不仅仅是 frame-parent。因此,如果 Facebook iframe 嵌入到您的域 A 中,那么它本身就会再次被 B 框住 - 那么 A 和 B 都必须被指定为有效的框架祖先。尽管页面管理员最多可以添加 50 个列入白名单的域,但我不知道您将如何让 Facebook 使用包含两者的 frame-ancestors 指令来响应。他们回复了与您指定的origin 对应的内容,我怀疑这会以某种方式获取多个 URL。 【参考方案1】:

Facebook 限制了哪些网站可以对其内容进行框架化,您看到的错误来自您的网站不允许对来自 Facebook 的内容进行框架化。 Facebook Checkbox 插件的实施步骤 1 (https://developers.facebook.com/docs/messenger-platform/discovery/checkbox-plugin/) 是将您的域列入白名单:https://developers.facebook.com/docs/messenger-platform/reference/messenger-profile-api/domain-whitelisting。这不是您可以在页面上更改的内容。

【讨论】:

以上是关于将 Facebook Checkbox 插件用作 iframe 小部件时出现 CSP 错误的主要内容,如果未能解决你的问题,请参考以下文章

IOS:如何将 UITableView 用作 Facebook 类应用程序的 Newsfeed 视图

脸书注册插件

Facebook 应用程序:localhost 不再用作应用程序域

如何使用 Nuxt.js 将自己的 JS 用作插件

将 Facebook 插件与 Unity 一起使用时出现 ActivityNotFoundException

阻止Facebook跟踪数据的Firefox开源插件Facebook Container