Security 存在电子邮件时处理OAuth注册/登录

Security 存在电子邮件时处理OAuth注册/登录,security,authentication,oauth,openid,Security,Authentication,Oauth,Openid,问题假设/条件: 存在具有电子邮件foo@bar.com(未验证)在系统中 访客未登录到系统(没有当前会话,例如新浏览器) 访客通过OAuth(用户授权)使用Google帐户注册/登录 系统接收带有uid的回调和电子邮件foo@bar.com[经谷歌验证] 我在这里看到三种选择: A.使用电子邮件将访问者登录到现有帐户foo@bar.com. 这有一些安全隐患 B.要求输入密码[假设系统中有密码,多个OAuth提供商可能不是这种情况],并在有效的情况下将其登录到现有帐户 C.拒绝登录/注册,说电

问题假设/条件:

  • 存在具有电子邮件
    foo@bar.com
    (未验证)在系统中
  • 访客未登录到系统(没有当前会话,例如新浏览器)
  • 访客通过OAuth(用户授权)使用Google帐户注册/登录
  • 系统接收带有uid的回调和电子邮件
    foo@bar.com
    [经谷歌验证]
  • 我在这里看到三种选择:

    A.使用电子邮件将访问者登录到现有帐户foo@bar.com. 这有一些安全隐患

    B.要求输入密码[假设系统中有密码,多个OAuth提供商可能不是这种情况],并在有效的情况下将其登录到现有帐户

    C.拒绝登录/注册,说电子邮件已经被使用,鼓励用户在连接谷歌之前登录

    选项A的安全风险是什么?

    我自己想到的是:


    可以执行“预期攻击”,即攻击者预期注册并在目标注册之前在系统上创建帐户。在目标使用OAuth注册后,他将有一个关于该帐户的活动会话。如果在执行#A.

    之前清除帐户上的所有会话,则会失败。当用户通过OAuth登录Google时,您可以确保从Google返回的电子邮件地址确实属于该用户。因此,您似乎担心的是,在您的系统中通过该电子邮件地址已知的用户并不拥有该电子邮件地址。这应该在他注册的时候就被发现了,当时他正在用电子邮件交谈。但是如果不是,你可能想重置密码并向真正的用户发送一封电子邮件,说明你这么做的原因。如果用户当前已登录,您可能还希望注销该用户。用户仍然可以访问其数据,但只能通过OAuth登录会话或通过响应电子邮件来访问。电子邮件中应说明这是一种预防措施,因为无法确定它是否真的是同一个人。

    也可能发生“意外攻击”:

    在步骤1中,使用地址
    foo@bar.com
    ,实际上是为了键入
    fuu@bar.com
    ,但键入了一个打字错误:
    foo
    ,而不是
    fuu

    现在,谷歌用户注册了Oauth和
    foo@bar.com
    ,并以这种方式劫持step-1用户的帐户。意外:-)由于步骤1用户的输入错误


    因此,step-1用户可以预期攻击Google用户,或者Google用户可以意外地攻击step-1用户。(我想不出还有其他攻击,至少现在没有。)

    发送电子邮件没有任何作用,因为它会发送给通过OAuth进行身份验证的用户。为什么允许步骤1,即使用未验证电子邮件地址的用户帐户?允许该用户登录吗?是不是因为你想要一个没有电子邮件验证的简单入职流程无论如何,我认为预期攻击是一种有趣的攻击。在我的应用程序中,我确实要求人们验证他们的电子邮件,但你的问题向我表明,验证电子邮件似乎是一个好主意。这对于Facebook和Google OAuth来说是安全的,它们可以干净地验证电子邮件吗?