通过电子邮件确认链接对用户进行身份验证是否安全?

信息安全 验证 Web应用程序 电子邮件 登记
2021-08-22 15:41:14

当用户在网站上注册时,他必须确认电子邮件以激活帐户。

单击确认链接时,通过一次性哈希识别用户以激活帐户。

立即对用户进行身份验证是否安全,还是应该在激活后通过登录名/密码登录?

建议注册流程:

  1. 使用登录名/电子邮件/密码填写注册表
  2. 通过带有哈希的一次性链接确认电子邮件
  3. 如果电子邮件已确认(并且帐户未激活),则验证用户并授予对其帐户的访问权限

我目前的注册流程:

  1. 使用登录名/电子邮件/密码填写注册表
  2. 通过带有哈希的一次性链接确认电子邮件
  3. 如果正确确认,用户需要输入电子邮件或登录名和密码

旁注:

  1. 可以访问电子邮件时,可以重置密码
  2. 注册表单仅包含登录名/电子邮件/密码
4个回答

这取决于您为什么要确认电子邮件。如果该电子邮件稍后将用于密码重置,则建议的工作流程存在重大安全问题。考虑以下场景:

  • Alice 创建了一个新帐户并无意中写了 Bob 的邮件(假设她复制粘贴邮件并使用了错误的行)
  • 邪恶的 Bob 看到邮件,确认帐户,如果 Alice 的登录名与电子邮件不同,则记下该登录名并注销
  • Alice 稍后尝试连接并发现一切正常 - 她假设验证是自动的,并且她通常会使用她的帐户一段时间
  • 一段时间后,Bob 尝试使用 Alice 的帐户进行连接,要求重置密码 => 因为他拥有挂号信,所以他成功更改了密码
  • Bob 现在拥有 Alice 的帐户,可以代表她做任何事情!

好的,Alice 在创建她的帐户时并不是很谨慎,但是建议的工作流程并没有真正保护她:-(

这就是为什么我喜欢的工作流程是:

  • 让用户创建一个带有登录名、密码和电子邮件的新帐户(可能是登录名或不登录名,最好不要)-> 帐户创建时未激活,如果在有限的时间段内(例如 2 天)未激活,将被销毁
  • 向给定邮件发送一个唯一的确认链接
  • 该链接会打开一个登录表单 - 用户名应该是预先填写的并且是只读的。如果用户成功登录,则验证帐户,使链接无效,并为用户设置会话。如果三次尝试后密码不正确,则连接断开。
  • 如果用户尝试使用未经验证的帐户进行连接,他/她会看到一条消息,说明验证邮件已发送到该地址,他/她仍有 n 天/小时来验证帐户,并建议他/她使用新的邮件地址重新创建帐户。在这种情况下,旧的验证链接会立即失效。

如果发生上述情况,Bob 将无法验证 Alice 的帐户,也无法在以后窃取她的帐户。

这取决于注册表单是否包含任何敏感数据,以及新创建的帐户是否对第三方有任何价值(无论是其自身还是冒充合法用户)。

问题是,如果用户在输入电子邮件地址时出错,注册链接可能会发送给陌生人。

  • 在建议的注册流程中,此未知收件人将有权访问新创建的帐户。
  • 在您当前的注册流程中,此链接对该收件人几乎毫无用处,他唯一能做的就是“验证”电子邮件地址。

因此,建议的注册流程可以为最终用户带来一些可用性改进,但代价是安全性可能稍弱。

使用您的“提议的注册流程”,您假设刚刚创建帐户的人是单击链接的人。这种假设通常是正确的,并且有些人会冒这个风险。之后,这是您在安全性和可用性之间寻找平衡的问题(非常有趣的辩论主题:D)。

这样做的坏处是,如果您的假设是错误的,有人可以从现在开始登录并重置具有完全访问权限的密码,甚至更改用户的电子邮件帐户。

使用您的“我当前的注册流程”,您可以增强安全性,同时冒着让用户再次登录的风险,即使这是他几分钟前刚刚做的事情。

我这样做的方式是,在注册时,我直接登录用户,同时限制他可以做什么,但为他打开一个会话。如果他想要完整的功能,则必须激活他的帐户。在他单击电子邮件中的一次性令牌链接后,他将被重定向到该网站,如果他有一个打开的会话,他将登录(打开的会话意味着某人有机会从注册到现在较低)否则他将不得不重新登录(这意味着他的会话同时已过期,因此这不再是我的用户的可能性更高)。

我希望这对你有所帮助,我希望我对我试图揭露的事情有所了解。

您在这里陈述的问题更多是您是否将安全性(一点点)最小化以获得更多可用性,或者您是否在两者之间找到了一些东西。

我会说,这取决于。

每个人都知道电子邮件是不安全的,您可以采取一些措施来确保电子邮件的安全,但据我所知,很少有人使用它,并且必须在发件人和收件人的帐户上都设置它。

正如@WhiteWinterWolf 所说,您将访问该帐户的权限授予拥有该电子邮件的任何人。就在昨天,我输错了我的电子邮件地址,我已经使用了 10 多年,并且在那段时间里一定输入了 10,000 多次,但仍然犯了一个错误。因此,如果它可以在那种情况下发生,那么它可以在更多情况下发生。

最后,你的随机性有多好?能猜到吗?我不知道您使用的是什么语言,但有些随机函数并不像您想象的那么随机。当您可以添加保护时,您是否愿意将全部信心投入到该随机功能中?

另外,我知道这不是 UX,但在用户体验方面并没有太大损失让他们再次登录,但作为预防措施,您可以让电子邮件身份验证页面检查注册页面生成的 cookie,这个将表明注册和电子邮件身份验证是在同一个浏览器上完成的,并删除使用该 cookie 登录的要求。