当前状态:
我有一个脚本,它生成一个具有特定域的iframe(在下面的示例中为domain.b.com).我希望iframe只从父域(包含我的脚本的页面)接收消息.由于父域在运行时是未知的,我正在考虑如下所述和说明的“握手”过程:
>等待加载Iframe.
>从父域发送postMessage及其来源.
>将允许的原点设置为第一个接收原点
编辑:
更多信息:
>在我的服务器上,我有一个白名单域名(例如domain.a.com,any.domain.com,domain.b.com)
>我的目标是与我的一些客户集成(例如domain.a.com,domain.b.com)
>一旦集成,我想防止黑客注入可以通过postMessage监听敏感信息的iframe
>我想避免检查白名单,我更愿意给出一些acessToken,但不确定什么是正确的流程.
例1:
例2:
这是实施它的正确方法吗?
解决方法
If you do expect to receive messages from other sites,always verify
the sender’s identity using the origin and possibly source properties.
Any window (including,for example,07001) can send
a message to any other window,and you have no guarantees that an
unknown sender will not send malicIoUs messages. Having verified
identity,however,you still should always verify the Syntax of the
received message. Otherwise,a security hole in the site you trusted
to send only trusted messages could then open a cross-site scripting
hole in your site.
一旦在iframe中拥有主框架的URI,就可以通过对服务器的简单AJAX调用来验证其授权.在我看来,服务器调用是不可避免的,你会以某种方式进行这样的调用.
还有其他方法可以知道谁包含了你的iframe,但他们并不依赖于postMessage.例如,如果您使用的是PHP,则可以检查$_SERVER [‘HTTP_REFERER’],以便在将iframe发送到浏览器之前查看iframe的请求.然而,referrer spoofing也有办法.
如果您的应用程序需要可靠的防弹解决方案,那么服务器与服在这种情况下,您的每个客户端都有一个用户名和密码,并且要为主页提供服务的Web服务器应该从服务iframe的Web服务器请求一次性传递令牌(这是服务器到服务器的通信) ).然后使用iframe的URL中的令牌发送回生成它的服务器.以下是此场景的一步一步:
>最终用户要求提供URL http://customer.com/main.PHP.
>当main.PHP正在执行并填充响应时,它也是
连接到
http://you_website.com/generate_token.PHP?username=cutomer1\u0026amp;password=123
并获得一次通过令牌令牌1.
>响应将返回到包含URL为http://your_website.com/iframe.PHP?token=token1的iframe的浏览器.
>在iframe.PHP中,验证token1以查看它是否有效,以及
同时,您在不实际询问的情况下对请求者进行身份验证
他的用户名和/或密码(因为你知道你有谁
为…生成令牌.
这些令牌一旦被使用(一次通过)通常被删除,并且它们通常也带有到期数据.但这取决于您和您的应用程序.