【发布时间】:2012-03-23 17:24:59
【问题描述】:
我有一个站点 A,它在 iframe B 中嵌入模块。这些模块可能是其他域。 用户在 A 中有一个经过身份验证的会话,我希望 B 拒绝加载,除非用户在 A 中有一个有效的会话。除了用户与 A 有经过身份验证的会话这一事实之外,B 不需要知道任何事情。没有会话数据需要。
目前,A 和 B 都不支持 HTTPS,但一旦我能说服楼上的人购买 SSL 证书,我希望改变这一点。
所以,我想出了两种完全不同的方案来以一种安全的方式完成此任务,但我不确定哪种方案会更好,所以我希望在这里得到一些反馈。 任何帮助表示赞赏!
选项 1
- A 将
?session=SESSION_ID附加到 B 的 URL - B处的服务器端脚本提取会话ID,并执行GET
A/verify?session=SESSION_ID - 回复 200 OK 或 403 Forbidden
- 如果来自 A 的回复是 200,则认为用户已通过身份验证,允许访问 B
优势
- 易于实施
- 无需共享配置(除了 A 的 URL,B 已经知道)
缺点
- B 必须联系 A,这会增加加载时间
- 会话 ID 应该是秘密的 - 不应该真的被传递
- 容易受到重放攻击(只要会话有效)
选项 2
- A 使用 A 和 B 之间共享的密钥加密包含时间戳、A 的 URL、B 的 URL 和盐的数据块,并将其附加到 B 的 URL
- B 的服务器端脚本解密数据块,验证 URL 并检查时间戳是否太旧
- 如果一切顺利,则认为用户已通过身份验证并允许访问 B
优势
- 没有服务器-服务器通信
- 会话 ID 永远不会传输到 B
- 不易受到重放攻击(超出时间戳允许的时间延迟)
缺点
- 实现起来更复杂
- A 和 B 需要在一定程度上实现时间同步
- A 和 B 需要共享密钥
【问题讨论】:
标签: security web cross-domain frames