我有一个主网站,它通过 iframe(提供各种功能和用户界面的旧系统)嵌入了 3 个其他网站。目前,用户必须对每个系统进行身份验证,尽管他们都使用相同的授权服务器。为了使其用户友好,我正在考虑使用 HTML5 消息传递 API 在各种 iframe 之间共享访问令牌,我想知道从安全角度来看这种方法是否可行?
在各种 iframe 之间通过 HTML5 消息传递 API 共享访问令牌是否安全?
postMessage API 是为跨域通信而设计的,作为跨域资源共享机制的一部分。
HTML5 中引入的 Window.postMessage() 方法允许在不同来源上运行的 JavaScript 代码以双向方式相互通信。此 API 可用于 iframe 与其父文档之间的通信。类似地,HTML 页面和子窗口可以使用它来交换消息,例如嵌入的第三方视频在用户暂停视频时通知其父框架。
经典的安全规则也适用于使用 postMessage() 的应用程序。您计划使用此方法来共享身份验证信息,如果您在实施时遵循基本的输入验证规则,这非常好。
永远不要广播您的身份验证令牌:您的场景包含需要访问公共令牌的多个不同方。您可能很想广播身份验证信息,以便所有 iframe 都可以访问它。这可能会导致未经授权访问您的令牌。因此 postMessage() 调用应始终指定目标来源。
始终验证消息来源:您需要验证消息是从有效且预期的来源收到的。只有在原始验证之后,您才应该继续在应用程序逻辑中使用该消息。想象一下,您的应用程序被恶意域构建的情况。如果您不验证消息的来源,可能会导致脚本注入。
此外,根据您与授权服务器的信任关系,您可能希望在验证发件人来源后验证令牌本身。
有关 postMessage() API 安全性的更详细分析以及一些示例代码片段,请参阅我的博客
您可以阅读现代浏览器在 cookie 和域访问控制方面遵循的规则:RFC6265
出于多种原因,不推荐使用IFrame (如 SEO、谷歌索引、安全性......)。
具有默认 cookie 域配置的新版本浏览器在本主题中的安全性为 99% 。然而,IFrame(和浏览器)历史上最大的安全风险是关于 CSRF 和 XSS。因此,如果您通过 CSRF 令牌和 XSS 过滤方法 + 正确的 cookie 域配置来保护您的网站,即使使用易受攻击的浏览器,使用 IFrame也几乎是安全的。