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

时间:2013-07-01 11:57:19

标签: javascript security web cross-domain postmessage

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

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

  1. 等待加载Iframe。
  2. 从父域发送postMessage及其来源。
  3. 将允许的原点设置为第一个接收的原点
  4. 修改 更多信息:

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

      enter image description here


      示例2:

      enter image description here

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

1 个答案:

答案 0 :(得分:4)

如上所述here,您不应期望在postMessage的参数中将父母的来源发送给您。代替:

  

如果您确实希望从其他网站接收消息,请始终进行验证   使用来源和可能来源属性的发件人身份。   任何窗口(包括,例如,http://evil.example.com)都可以发送   一条消息到任何其他窗口,你不能保证一个   未知发件人不会发送恶意邮件。经过验证   但是,你仍然应该始终验证语法   收到消息。否则,您信任的站点中存在安全漏洞   然后,只发送受信任的消息可以打开跨站点脚本   您网站上的洞。

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

还有其他方法可以了解谁包含您的iframe,但他们并不依赖postMessage。例如,如果您使用的是PHP,则可以检查$_SERVER['HTTP_REFERER'],以便在将iframe发送到浏览器之前查看iframe的请求。然而,referrer spoofing也有办法。

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

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

  2. main.php正在执行并填充响应时,它也是 连接到 http://you_website.com/generate_token.php?username=cutomer1&password=123 并获得一次通过令牌token1

  3. 响应将返回到包含网址为http://your_website.com/iframe.php?token=token1的iframe的浏览器。

  4. iframe.php中,您验证token1是否有效,并且 同时,您在不实际询问的情况下对请求者进行身份验证 他的用户名和/或密码(因为你知道你有谁 为...生成令牌。

  5. 这些令牌一旦被使用(一次通过)通常被删除,并且它们通常也带有到期数据。但这取决于您和您的申请。