在各种 iframe 之间通过 HTML5 消息传递 API 共享访问令牌是否安全?

信息安全 Web应用程序 javascript html-5
2021-08-22 00:38:40

我有一个主网站,它通过 iframe(提供各种功能和用户界面的旧系统)嵌入了 3 个其他网站。目前,用户必须对每个系统进行身份验证,尽管他们都使用相同的授权服务器。为了使其用户友好,我正在考虑使用 HTML5 消息传递 API 在各种 iframe 之间共享访问令牌,我想知道从安全角度来看这种方法是否可行?

2个回答

postMessage API 是为跨域通信而设计的,作为跨域资源共享机制的一部分

HTML5 中引入的 Window.postMessage() 方法允许在不同来源上运行的 JavaScript 代码以双向方式相互通信。此 API 可用于 iframe 与其父文档之间的通信。类似地,HTML 页面和子窗口可以使用它来交换消息,例如嵌入的第三方视频在用户暂停视频时通知其父框架。

经典的安全规则也适用于使用 postMessage() 的应用程序。您计划使用此方法来共享身份验证信息,如果您在实施时遵循基本的输入验证规则,这非常好。

  1. 永远不要广播您的身份验证令牌:您的场景包含需要访问公共令牌的多个不同方。您可能很想广播身份验证信息,以便所有 iframe 都可以访问它。这可能会导致未经授权访问您的令牌。因此 postMessage() 调用应始终指定目标来源。

  2. 始终验证消息来源:您需要验证消息是从有效且预期的来源收到的。只有在原始验证之后,您才应该继续在应用程序逻辑中使用该消息。想象一下,您的应用程序被恶意域构建的情况。如果您不验证消息的来源,可能会导致脚本注入。

此外,根据您与授权服务器的信任关系,您可能希望在验证发件人来源后验证令牌本身。

有关 postMessage() API 安全性的更详细分析以及一些示例代码片段,请参阅我的博客

您可以阅读现代浏览器在 cookie 和域访问控制方面遵循的规则:RFC6265

出于多种原因,不推荐使用IFrame (如 SEO、谷歌索引、安全性......)。

具有默认 cookie 域配置的新版本浏览器在本主题中的安全性为 99% 。然而,IFrame(和浏览器)历史上最大的安全风险是关于 CSRF 和 XSS。因此,如果您通过 CSRF 令牌和 XSS 过滤方法 + 正确的 cookie 域配置来保护您的网站,即使使用易受攻击的浏览器,使用 IFrame也几乎是安全的。