8

我想使用在运行时创建的 iframe 创建一个安全的 postMessage 连接(来源安全)。

当前状态: 我有一个脚本,它生成一个具有特定域的 iframe(domain.b.com在下面的示例中)。我希望该 iframe 仅接收来自父域(包含我的脚本的页面)的消息。由于父域在运行时是未知的,因此我正在考虑如下所述和说明的“握手”过程:

  1. 等待加载 iframe。
  2. 从父域发送带有其来源的 postMessage。
  3. 将允许的原点设置为第一个收到的原点

编辑: 更多信息:

  1. 在我的服务器上,我有一个白名单域(例如 domain.a.com、any.domain.com、domain.b.com)
  2. 我的目标是与我的一些客户集成(例如 domain.a.com 、 domain.b.com)
  3. 一旦集成,我想防止黑客注入可以通过 postMessage 监听敏感信息的 iframe
  4. 我想避免检查白名单,我更喜欢给一些 accessToken,但不确定什么是正确的流程。

示例 1:

在此处输入图像描述


示例 2:

在此处输入图像描述

这是实施它的正确方法吗?

4

1 回答 1

5

正如这里提到的,你不应该期望父母的来源会在postMessage's 参数中发送给你。反而:

如果您确实希望收到来自其他站点的消息,请始终使用源属性和可能的​​源属性来验证发件人身份。任何窗口(包括例如http://evil.example.com)都可以向任何其他窗口发送消息,并且您无法保证未知发件人不会发送恶意消息。然而,在验证了身份之后,您仍然应该始终验证接收到的消息的语法。否则,您信任的仅发送受信任消息的站点中的安全漏洞可能会在您的站点中打开跨站点脚本漏洞。

一旦你的 iframe 中有主框架的 URI,你就可以通过对服务器的简单 AJAX 调用来验证它的授权。在我看来,服务器调用是不可避免的,你会以一种或另一种方式进行这样的调用。

还有其他方法可以知道谁包含您的 iframe,但他们不依赖postMessage. 例如,如果您使用 PHP,您$_SERVER['HTTP_REFERER']甚至可以在将 iframe 发送到浏览器之前查看谁在请求您的 iframe。然而,也有一些引荐来源欺骗的方法。

如果您的应用程序需要可靠的防弹解决方案,那么服务器到服务器的通信就是您的方式。在这种情况下,您的每个客户端都有一个用户名和密码,并且要为主页提供服务的 Web 服务器应该向提供 iframe 的 Web 服务器请求一次性传递令牌(这是服务器到服务器的通信)。然后使用 iframe 的 URL 中的令牌发送回生成它的服务器。下面是这个场景的一步一步:

  1. 最终用户要求提供 URL http://customer.com/main.php

  2. main.php执行和填充响应时,它还会连接 http://you_website.com/generate_token.php?username=cutomer1&password=123 并获取一次性令牌token1

  3. 响应将返回到包含带有 URL 的 iframe 的浏览器http://your_website.com/iframe.php?token=token1

  4. iframe.php您验证token1它是否有效,同时,您正在验证请求者而不实际询问他的用户名和/或密码(因为您知道您为谁生成了令牌)。

此类令牌通常在使用后会被删除(一次通过),并且它们通常还带有过期数据。但这取决于您和您的应用程序。

于 2013-07-04T08:48:48.337 回答