正如这里提到的,你不应该期望父母的来源会在postMessage
's 参数中发送给你。反而:
如果您确实希望收到来自其他站点的消息,请始终使用源属性和可能的源属性来验证发件人的身份。任何窗口(包括例如http://evil.example.com)都可以向任何其他窗口发送消息,并且您无法保证未知发件人不会发送恶意消息。然而,在验证了身份之后,您仍然应该始终验证接收到的消息的语法。否则,您信任的仅发送受信任消息的站点中的安全漏洞可能会在您的站点中打开跨站点脚本漏洞。
一旦你的 iframe 中有主框架的 URI,你就可以通过对服务器的简单 AJAX 调用来验证它的授权。在我看来,服务器调用是不可避免的,你会以一种或另一种方式进行这样的调用。
还有其他方法可以知道谁包含您的 iframe,但他们不依赖postMessage
. 例如,如果您使用 PHP,您$_SERVER['HTTP_REFERER']
甚至可以在将 iframe 发送到浏览器之前查看谁在请求您的 iframe。然而,也有一些引荐来源欺骗的方法。
如果您的应用程序需要可靠的防弹解决方案,那么服务器到服务器的通信就是您的方式。在这种情况下,您的每个客户端都有一个用户名和密码,并且要为主页提供服务的 Web 服务器应该向提供 iframe 的 Web 服务器请求一次性传递令牌(这是服务器到服务器的通信)。然后使用 iframe 的 URL 中的令牌发送回生成它的服务器。下面是这个场景的一步一步:
最终用户要求提供 URL http://customer.com/main.php
。
在main.php
执行和填充响应时,它还会连接
http://you_website.com/generate_token.php?username=cutomer1&password=123
并获取一次性令牌token1
。
响应将返回到包含带有 URL 的 iframe 的浏览器http://your_website.com/iframe.php?token=token1
。
在iframe.php
您验证token1
它是否有效,同时,您正在验证请求者而不实际询问他的用户名和/或密码(因为您知道您为谁生成了令牌)。
此类令牌通常在使用后会被删除(一次通过),并且它们通常还带有过期数据。但这取决于您和您的应用程序。