验证一个未验证的电子邮件地址?

3
一个用户在注册一个网站时需要先验证其邮箱地址是否有效,通常的方法是发送一封电子邮件到提供的邮箱地址中,用户打开邮箱,点击链接以告知该网站该邮箱地址有效。通常情况下,链接中会嵌入某些代码,以告诉该网站这是一个合法的邮箱地址验证。
我的问题是关于代码的。实施最佳方式是什么?以下是一些想法:
1. 在输入新地址时生成一个随机字符串,并将该随机字符串存储在数据库中并通过电子邮件发送给注册者。电子邮件中的链接将包含随机字符串作为URL的一部分。 2. 邮箱地址被哈希。这意味着不需要在数据库中保存任何内容,因为应用程序将知道如何解密。 (我对这种方法的担忧是如果用户稍后将其电子邮件地址更改为先前输入的内容,则哈希值将相同。不确定这是否会构成某种安全威胁。) 3. 其他方法?
我正在寻求有关此问题的一般建议。
2个回答

3

第一种方法是使用随机字符串,这是最安全的(也是我知道的最常见的)方法:它使得恶意用户无法对我没有接收到邮件的电子邮件地址进行恶意操作。

另外,您可以在成功完成后删除随机字符串,从而清楚地表明该特定地址不再需要激活。


Pekka,我计划在我的数据库中拥有“verified_email_address”和“unverified_email_address”字段。我想现在我也需要一个“verification_code”字段。我认为我需要两个电子邮件地址字段的原因是用户以后可以更改他的电子邮件地址。在这个过渡期间,我需要记录两个电子邮件地址,对吧?由于我的验证电子邮件地址需要唯一,所以我需要应用程序层来检查未验证的电子邮件地址是否存在于两个字段中? - StackOverflowNewbie
@Stack 听起来很有道理。或者,我猜你可以有一个“已验证”的标志,如果用户更改他们的电子邮件地址,该标志会被删除 - 这可能会产生同样的效果。像Google这样的大公司完全以不同的方式处理:它们允许您拥有多个电子邮件地址,所有这些地址都必须单独激活。但是,这种复杂性并不总是必要的。 - Pekka
@StackOverflowNewbie:二次验证很麻烦。你怎么区分a)一个合法用户的旧邮箱不再可用(也许是域名注册过期了,或密码恢复失败了),和b)一个试图劫持现有账户的非法用户?如果你发一个验证链接到旧的邮件地址,那么合法用户将收不到该邮件。如果你发送到新的邮件地址,合法用户的帐户就会被劫持。(安全问题旨在解决这个问题。) - Mike Sherrill 'Cat Recall'
为了更改用户的电子邮件地址,用户必须已经登录系统。如果用户已登录系统,则假定用户是合法的,应能够更改其帐户电子邮件地址。向旧电子邮件地址发送电子邮件通知可能至少有助于防止潜在的劫持? - StackOverflowNewbie

2

我每次都使用第一种方法

  1. 创建一个随机码
  2. 将其存储在数据库中
  3. 通过可点击的链接像activation.php?key=blabla这样将其发送给用户
  4. 在激活页面上,让用户也能手动输入它
  5. 在提交时比较密钥
  6. 激活用户
  7. 如果用户更改电子邮件地址,则返回1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接