2010-03-10 60 views
2

我的网站上有一个基于开放标识的身份验证系统。如何在请求完成时验证我的openid.op_endpoint

偶尔,用户将有[email protected]下注册了一个账号,他们会尝试使用谷歌的开放ID提供https://www.google.com/accounts/o8/id登录,在这种情况下,我想自动帐户关联,并记录它们。

当进程完成我从某个地方得到一个有效载荷,声称openid.op_endpoint=https://www.google.com/accounts/o8/id

我的问题:

  • 我能相信openid.op_endpoint是正确的?这可以通过恶意的openid提供商以某种方式欺骗吗?

为了说明,可以说在http://evil.org作为他们的OpenID提供商有人类型,我能以某种方式最终得到一个请求,声称openid.op_endpoint是谷歌?我是否需要存储额外的信息来对付现时验证?

该规范是kind of tricky了解

回答

1

是,也不是。不,你不应该相信任何你通过电线,包括openid.op_endpoint。但是,如果您使用安全的OpenID库,则在用户被允许登录到您的网站之前验证此参数。实际上,OpenID规范必须提供一种方法来验证此参数和其他参数,并且在没有验证的情况下认证协议比无用的更糟糕。

所以,确保你的图书馆是体面的。那么是的,请相信openid.op_endpoint参数。但不是您自己从查询字符串中获得的那个,因为OpenID消息可以发送给您,并且该参数不会显示在查询字符串中。更糟糕的是,如果你在这种情况下检查查询字符串,你可能会打开自己的安全漏洞,攻击者可以将该参数添加到查询字符串中,并在符合库的要求时欺骗你。因此,最好使用库公开的API来找出OP端点的内容。

就以这种方式链接帐户而言,这是一种很好的方法,因为Google只会发送它确实由用户控制的电子邮件地址。如果您已经要求您的用户通过电子邮件验证步骤,那么链接该帐户是安全的。但是,如果您为用户提供的电子邮件地址没有经过验证,那么您不得根据此匹配链接帐户,或者通过创建拥有其他人的电子邮件地址的帐户来劫持其他人的帐户,然后等待他们使用OpenID登录,现在我可以进入他们的帐户。

+0

看到我的扩展问题。 – 2010-03-11 02:01:26

+1

嗨,山姆。你描述的场景对攻击者来说当然是可能的。但是正确实施的OpenID RP不会被愚弄。一堆测试看到RP不容易受到这样的攻击:http://test-id.org/RP/VerifyAssertionDiscovery.aspx – 2010-03-11 05:32:31