【问题标题】:Best way of validating session in other-domain iframe在其他域 iframe 中验证会话的最佳方式
【发布时间】:2012-03-23 17:24:59
【问题描述】:

我有一个站点 A,它在 iframe B 中嵌入模块。这些模块可能是其他域。 用户在 A 中有一个经过身份验证的会话,我希望 B 拒绝加载,除非用户在 A 中有一个有效的会话。除了用户与 A 有经过身份验证的会话这一事实之外,B 不需要知道任何事情。没有会话数据需要。

目前,A 和 B 都不支持 HTTPS,但一旦我能说服楼上的人购买 SSL 证书,我希望改变这一点。

所以,我想出了两种完全不同的方案来以一种安全的方式完成此任务,但我不确定哪种方案会更好,所以我希望在这里得到一些反馈。 任何帮助表示赞赏!

选项 1

  1. A 将 ?session=SESSION_ID 附加到 B 的 URL
  2. B处的服务器端脚本提取会话ID,并执行GET A/verify?session=SESSION_ID
  3. 回复 200 OK 或 403 Forbidden
  4. 如果来自 A 的回复是 200,则认为用户已通过身份验证,允许访问 B

优势

  • 易于实施
  • 无需共享配置(除了 A 的 URL,B 已经知道)

缺点

  • B 必须联系 A,这会增加加载时间
  • 会话 ID 应该是秘密的 - 不应该真的被传递
  • 容易受到重放攻击(只要会话有效)

选项 2

  1. A 使用 A 和 B 之间共享的密钥加密包含时间戳、A 的 URL、B 的 URL 和盐的数据块,并将其附加到 B 的 URL
  2. B 的服务器端脚本解密数据块,验证 URL 并检查时间戳是否太旧
  3. 如果一切顺利,则认为用户已通过身份验证并允许访问 B

优势

  • 没有服务器-服务器通信
  • 会话 ID 永远不会传输到 B
  • 不易受到重放攻击(超出时间戳允许的时间延迟)

缺点

  • 实现起来更复杂
  • A 和 B 需要在一定程度上实现时间同步
  • A 和 B 需要共享密钥

【问题讨论】:

    标签: security web cross-domain frames


    【解决方案1】:

    选项 3

    A 生成随机散列并将其与会话 ID(两个字段)一起存储在数据库表中。 A 将哈希传递给 B 的每个 URL,例如 `B/?hash=x'

    A 检查哈希是否与数据库表中的任何匹配,并检查会话 ID 是否仍然经过身份验证(可能已注销或过期),然后告诉 B 是否正确。喜欢A/verify?hash=x

    正如你所说,B 不需要知道除了是否经过身份验证之外的任何信息。

    这种方式不会在 URL 中传递会话 ID,正如您所说的那样并不理想。

    【讨论】:

    • 不幸的是,该方法存在一些问题:1) 仍然需要服务器-服务器通信,以及 2) 由于对 A/verify 的请求是由 B 处的服务器完成的,而不是由用户完成的,该请求无权访问用户的会话,因此无权访问哈希。传递会话 ID 的原因是 A 可以使用给定 ID 启动会话并检查它是否已通过身份验证
    • 你说得对,我已经编辑了答案,再看看。它仍然需要服务器-服务器通信,但我认为这比将加密数据传递给 B 更好。
    • 我最终这样做了,除了哈希使用 APC 存储在内存中,因为不需要持久性。
    • 听起来不错。 +1 表示在发布问题之前所做的努力和研究。
    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 2023-04-04
    • 2015-04-26
    • 1970-01-01
    • 2016-11-22
    • 2018-08-05
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多