在其他域iframe中验证会话的最佳方法

时间:2012-03-06 08:30:33

标签: security web cross-domain frames

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

目前,A和B都不支持HTTPS,但我想说服一旦我说服楼上的人购买SSL证书。

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

选项1

  1. A将?session=SESSION_ID附加到B的网址
  2. B处的服务器端脚本提取会话ID,并执行GET A/verify?session=SESSION_ID
  3. 回复200 OK或403 Forbidden
  4. 如果A的回复是200,则认为用户被认证是允许访问B
  5. 上升空间

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

    缺点

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

    选项2

    1. A加密包含时间戳,A的URL,B的URL和带有A和B之间共享密钥的盐的数据块,并将其附加到B的URL
    2. B处的服务器端脚本解密数据块,验证URL并检查时间戳是否过旧
    3. 如果所有内容都已检出,则认为该用户已通过身份验证,并且可以访问B
    4. 上升空间

      • 无服务器 - 服务器通信
      • 会话ID永远不会传送给B
      • 不易受重播攻击(超出时间戳允许的时间延迟)

      缺点

      • 实施起来比较复杂
      • A和B需要有点时间同步
      • A和B需要共享密钥

1 个答案:

答案 0 :(得分:2)

选项3

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

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

正如您所说,B除了经过身份验证之外,不需要知道任何其他内容。

这样,在网址中不会传递任何会话ID,正如您所说,这不是理想的。