【发布时间】:2017-03-23 18:40:57
【问题描述】:
我们有一个应用程序概述如下。 UI 由安全域 https://aaa.com 提供,并托管来自同一域的脚本。
它将客户端站点 https://client.com 加载到 IFRAME。此站点不可信任,并且可能包含恶意 XSS,因为它的代码质量通常低于我们的应用程序。
该站点从我们的第二个域https://bbb.com 加载另一个受信任的脚本。如有必要,此脚本也可以源自 https://aaa.com。 aaa 和 bbb 脚本都从 aaa.com 调用 REST API,并且需要安全令牌。安全令牌是通过从域 aaa 的顶部窗口登录 UI 获得的。
我们需要建立一个安全通道,以便将安全令牌从浏览器窗口中的私有闭包(scriptA.js)传递到我们在 IFRAME 中的脚本(scriptB.js)中的私有闭包
由于客户端站点是不同的域,我们需要使用 postMessage API 来进行脚本的通信。理想情况下,我们希望传递可信消息,例如“嘿,我是 scriptB,向我发送使用此密钥加密的令牌(为该单个事件生成的非对称加密公钥),并让 scriptA 发送恶意 XSS 无法读取的加密密钥”。
然而,恶意 XSS 也可能伪装成 scriptB,因为它位于同一个域中,并使用自己的密钥更早地发送此类消息并从响应中侦听令牌。
问题是我们如何确保可以在 scriptA 中验证请求消息是从 https://bbb.com 加载的脚本发送的,而不是从 client.com 或其他域加载的 XSS,或者其他安全方式通信可用于安全地将令牌从 scriptA 传递到 scriptB。
有什么建议吗?
【问题讨论】:
标签: javascript security iframe encryption postmessage