JS - 如何在发件人域未知时安全地使用window.postMessage

Shl*_*rtz 7 javascript security postmessage cross-domain web

我想创建一个安全的postMessage连接(​​origin safe),其中包含在运行时创建的Iframe.

当前状态: 我有一个脚本,它生成一个具有特定域的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. 我想避免检查白名单,我更喜欢给一些acessToken,但不确定什么是正确的流程.

例1:

在此输入图像描述


例2:

在此输入图像描述

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

Meh*_*ran 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以查看它是否有效时,同时,您正在对请求者进行身份验证,而无需实际询问他的用户名和/或密码(因为您知道为谁生成了令牌)。

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