将用户帐户限制为唯一电子邮件地址似乎很常见。因此,在我的用户注册表上,我正在进行电子邮件验证并返回类似的消息
已经为注册了帐户foo@bar.com
然后我突然想到,攻击者可以使用此表单来确定有关我的用户的信息。有没有其他方法可以在不影响安全性的情况下向我的用户提供验证消息?在我看来没有任何办法。
对于大多数类型的网站,我认为显式隐藏这些信息将是一种糟糕的用户体验权衡。更好的解决方案是使用CAPTCHA来帮助防止电子邮件地址的战争拨号。
例外情况是攻击者正在寻找特定用户的信息(而不仅仅是试图找到"某个帐户")。例如,如果你的网站迎合了对匿名有强烈兴趣的人,而有攻击者对查明特定用户是否在使用该网站有强烈兴趣,那么方法应该有所不同。我的方法可能是向地址发送一封电子邮件,指出"已注册"的错误。用户对匿名的兴趣会超过用户体验的烦恼。
以下是一些大公司的做法:
- AWS:
Error: Account with this email already exists.
- 苹果ID:
This email address is not available. Choose a different address.
- Cloudflare:
A user with that email already exists (Code: 1079)
- 链接:
Someone's already using that email.
- 堆栈溢出:
Forgot your account’s password or having trouble logging into your Team? Enter your email address and we’ll send you a recovery link.
简单地告诉他们不能使用他们提供的电子邮件地址?你不需要给出更多的理由吗?如果他们知道这不是他们的电子邮件,他们可能仍然会猜测这是一个现有的地址,但你还没有确认。
或
告诉他们你已经给那个地址发了一封电子邮件,他们需要确认——即使你没有。
我可以想出一种方法:你可以询问一个电子邮件地址,然后将一次性注册表格的链接发送到该电子邮件地址。你可能需要一个captcha在那里阻止垃圾邮件。如果电子邮件已经在系统中,它可能会发送一条消息,说他们已经有了一个帐户。
我认为这是没有必要的,除非你的网站是特别秘密的,比如虐待受害者的支持小组。
我认为在不指示电子邮件地址已在使用的情况下创建错误消息是不可能的,因为这就是电子邮件地址的意义所在。
这些是我看到的选项:
1) 显示一条不太清楚的错误消息,如"电子邮件地址无效"
2) 接受注册并通过电子邮件通知用户他以前的帐户(我建议)
在任何情况下,您都可以通过同一客户端的captcha代码和限制请求来提高安全性。如果你非常关心用户的隐私,那么强制进行唯一的电子邮件注册可能不适合你的网站。
如果您已经有此电子邮件或用户的现有电子邮件别名,则可以收到此错误消息foo@bar.com.
您可以检查是否存在电子邮件别名,然后您必须首先删除它,然后尝试创建它。