我想知道使用电子邮件作为用户登录的主要标识符(当然,使用关联的密码)的安全隐患。我可以像对待普通用户名一样对待它,还是应该采取额外的预防措施,例如在通过删除任何 + 部分(例如,someone+note@example.org)比较它的唯一性之前“清理”电子邮件地址?
我能立即想到的一个真正含义是注意不要公开检查电子邮件是否已在系统中注册(例如,通过密码检查失败)。
我想知道使用电子邮件作为用户登录的主要标识符(当然,使用关联的密码)的安全隐患。我可以像对待普通用户名一样对待它,还是应该采取额外的预防措施,例如在通过删除任何 + 部分(例如,someone+note@example.org)比较它的唯一性之前“清理”电子邮件地址?
我能立即想到的一个真正含义是注意不要公开检查电子邮件是否已在系统中注册(例如,通过密码检查失败)。
电子邮件通常作为用户名是一件好事,因为:
名义上,至少电子邮件地址的右半部分(域名,在“@”符号之后)不区分大小写,因此您应该将该部分规范化为小写,这很容易,因为它应该是一个有效的域名称,因此仅限于 ASCII 的子集(注意:您需要注意使用 .NET 所称的不变文化,而 Java 术语为根区域设置;否则,您的代码将在土耳其中断)。
对于左侧的内容,区分大小写取决于接收站点。大多数站点对该部分也不区分大小写,并且进行小写规范化似乎是“合理的”,因为给定站点不太可能既区分大小写又使用大小写来区分不同的人(即,bob@example.com和BOB@example.com都是有效的地址)两个不同的鲍勃)。因此,我建议对整个地址进行小写规范化以进行比较(即确定我们正在谈论的用户);但是,如果您想向用户发回电子邮件,或者即使您想将其显示给用户(例如,作为“欢迎,Bob@example.com”横幅 - Bob 可能非常喜欢他的大写“B”)。
关于“+”号:从您的角度来看,这是地址的一部分。这个“+”在某些网站上被处理为每个用户生成许多功能等效地址的一种方式:Bob 将能够使用bob+work@example.com, bob+home@example.com, bob+the-ultimate-warlord@example.com... 发送到任何这些地址的所有电子邮件都以 Bob 的邮箱结尾,但是,在 Bob 的眼中,它们仍然是 Bob 输入的不同地址。Bob期望地址被认为是不同的。所以你对“+”的处理取决于你真正想要的:
摘要:保持注册时输入的地址,并按“原样”使用它来显示和发送电子邮件。对于比较(即在用户表中定位用户条目,例如在登录时),将电子邮件规范化为小写(具有不变的文化)。
使用电子邮件作为用户名的主要风险是它放弃了联系用户的次要方式。许多(大多数?)用户使用相同的密码进行多项操作。如果用户名和密码被泄露并且用户名是他们的电子邮件,那么他们的电子邮件帐户也很可能最终被泄露。除非您使用基于 SMS 的恢复系统,否则这会使帐户恢复变得非常困难。
电子邮件地址作为用户名通常是一件坏事(对于银行等高度敏感的功能),因为:
这一切都需要平衡用户能够记住他们的用户名。在许多网站上,都有一个链接到电子邮件地址的“向我发送我的用户名”功能。不过,其他人已经涵盖了使用电子邮件作为用户 ID 的好处。
我可以像对待普通用户名一样对待它,还是应该采取额外的预防措施,例如在通过删除任何 + 部分(例如,someone+note@example.org)比较它的唯一性之前“清理”电子邮件地址?
请参阅我知道如何验证电子邮件地址,直到我阅读 RFC以获取更多信息,但我不会去清理地址,因为信不信由你以下都是有效的:
如果实施不正确,使用电子邮件地址作为用户名可能会导致用户名枚举,并且它比任意用户名更像是一个目标 - 攻击者更有可能知道有效的用户名,因为它们很可能是用户的公共电子邮件地址。不过,这是一个可以解决的问题。
帐户锁定 DoS 可以通过分别通过电子邮件地址和 IP 地址限制重复的失败登录尝试或密码重置来缓解。
您还应该通过让他们单击激活电子邮件来验证所有新用户的电子邮件地址。这样可以确保电子邮件地址是用户的,并且他们可以在将来需要时重置访问权限。您可以将注册与密码重置系统相结合,以一石二鸟。