我的网站上有一个基于Open ID的身份验证系统。
有时用户会在foo@gmail.com
下注册一个帐户,他们会尝试使用google开放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
是Google?我是否需要存储针对nonce进行验证的额外信息?
要理解规范kind of tricky
答案 0 :(得分:1)
是和否。不,你不应该相信你通过电汇获得的任何东西,包括openid.op_endpoint
。但是,如果您使用的是安全的OpenID库,则在允许用户登录您的站点之前,将验证此参数。实际上,OpenID规范必须提供一种方法来验证此参数和其他参数,并且在没有验证的情况下,验证协议比无用的更糟糕。
因此,请确保您的图书馆体面。然后是,请相信openid.op_endpoint参数。但不是您自己从查询字符串中获取的那个,因为OpenID消息可以发布给您,并且参数不会显示在查询字符串中。更糟糕的是,如果你在这种情况下检查查询字符串,你可能会打开一个安全漏洞,攻击者可以将该参数添加到查询字符串中,并在遵守库的要求时欺骗你。因此,最好使用库公开的API来找出OP端点是什么。
至于以这种方式链接帐户,这是一种很好的方法,因为Google只会发送它知道真正由用户控制的电子邮件地址。如果您已经要求您的用户完成电子邮件验证步骤,则可以安全地关联该帐户。但是,如果您没有验证用户的电子邮件地址,那么您不能根据此匹配链接帐户,或者我可以通过创建具有其他人电子邮件地址的帐户来劫持其他人的帐户,然后等待他们使用OpenID登录,现在我可以进入他们的帐户。