发件人域未知时如何安全地使用window.postMessage
我想创建一个安全的postMessage连接(原点安全),并在运行时创建一个Iframe。
当前状态:我有一个脚本,它会生成一个具有特定域的iframe(下domain.b.com
中的domain.b.com
)。 我希望iframe只接收来自父域(包含我的脚本的页面)的消息。 由于父域在运行时是未知的,因此我正在考虑如下所述的“握手”过程:
编辑:更多信息:
例1:
例2:
这是实施它的正确方法吗?
如上所述,您不应该期望父邮件的来源通过postMessage
的参数发送给您。 代替:
如果您确实希望收到来自其他网站的邮件,请始终使用来源和可能的来源属性验证发件人的身份。 任何窗口(包括,例如http://evil.example.com)都可以将消息发送到任何其他窗口,并且您不能保证未知发件人不会发送恶意消息。 但是,验证身份后,您仍然应该始终验证接收到的消息的语法。 否则,您信任的站点中只发送受信任邮件的安全漏洞可能会在您的站点中打开跨站点脚本漏洞。
一旦在iframe中拥有主框架的URI,就可以通过对服务器的简单AJAX调用来验证其授权。 在我看来,服务器通话是不可避免的,无论如何,您都可以拨打这样的电话。
还有其他方法可以知道谁在包含您的iframe,但他们不依赖于postMessage
。 例如,如果您使用的是PHP,您可以检查$_SERVER['HTTP_REFERER']
以便在发送给浏览器之前查看哪些人正在请求您的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 http://your_website.com/iframe.php?token=token1
的iframe的浏览器。
在iframe.php
您验证token1
以查看它是否有效,同时,您在未实际询问其用户名和/或密码的情况下对请求者进行身份验证(因为您知道为谁生成了令牌)。
这些令牌通常会在使用后一次性删除(一次性传递),并且通常还会附带过期数据。 但这取决于你和你的应用程序。
链接地址: http://www.djcxy.com/p/72467.html上一篇: How to securely use window.postMessage when the sender domain is unknown