我想创建一个安全的postMessage连接(origin safe),其中包含在运行时创建的Iframe。
当前状态:
我有一个脚本,它生成一个带有特定域的iframe(下例中为domain.b.com
)。我希望iframe仅从父域(包含我的脚本的页面)接收消息。由于父域在运行时是未知的,我正在考虑如下所述和说明的“握手”过程:
修改 更多信息:
示例1:
示例2:
这是实施它的正确方法吗?
答案 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中的令牌发送回生成它的服务器。以下是此场景的一步一步:
最终用户要求提供网址http://customer.com/main.php
。
当main.php
正在执行并填充响应时,它也是
连接到
http://you_website.com/generate_token.php?username=cutomer1&password=123
并获得一次通过令牌token1
。
响应将返回到包含网址为http://your_website.com/iframe.php?token=token1
的iframe的浏览器。
在iframe.php
中,您验证token1
是否有效,并且
同时,您在不实际询问的情况下对请求者进行身份验证
他的用户名和/或密码(因为你知道你有谁
为...生成令牌。
这些令牌一旦被使用(一次通过)通常被删除,并且它们通常也带有到期数据。但这取决于您和您的申请。