用于验证网站电子邮件的基本概念是什么?

What is the basic concept used to verify emails on websites?

问题: 我正在尝试在 Wix.com 上建立一个网站,我的功能之一是电子邮件验证。

背景: 我当前的过程是用户注册将他们带到 www.abc.com/example?id=12345,其中 12345 是由数据库生成的随机数,对于数据库中的每一行都是独立的。

然后用户会收到一封电子邮件,其中包含 url www.abc.com/verify?id=12345 打开以验证他们的帐户。

正如您可能看到的那样,这是非常不安全的,因为有人可以执行一次此过程并弄清楚如何以其他人的名义创建帐户。

问题: 标准的行业方法是什么? 我目前的想法是使用用户无法访问的第二个 url 查询,因此无法猜测或解决,但我正在努力思考那会是什么

没有这样做的“行业标准”。有许多创新的方法可以做到这一点。简而言之 - 如果它有效,它就有效。

最常见的方法通常涉及

  • 生成随机码
  • 将该代码存储在数据库中
  • 当请求验证他们的电子邮件地址时,在数据库中搜索代码。如果存在,您可以将代码所属的用户标记为已验证

这很容易做到。在我看来,您好像卡在了“生成随机代码”部分。

有两种基本方法可以做到这一点。

1)生成随机数

2) 加盐电子邮件地址

生成一个随机数

您可以生成一个随机数作为代码。这可以通过以下方式完成:

Random rnd = new Random();
int n = 100000 + rnd.nextInt(900000);

生成一个随机的 6 位数字。可以对其进行调整以适应更高的数字。这种方法的问题在于,如果您要处理大量用户群,随机生成的数字很可能会从 运行 开始。您将必须添加验证方法以确保生成的代码尚未被使用。

加盐电子邮件地址

这是最简单的方法。您需要做的就是确保没有重复的帐户使用相同的电子邮件地址。

对于初学者,您需要用户的电子邮件地址和他们的注册日期(用于加盐)。您可以连接这两个字符串,然后执行加密散列。如果你不知道如何表演,就去 here.

这样做的好处是,一个代码有无限可能的组合。

示例:

假设我的电子邮件是 notmyaddressbutstilldarngood@domain.nice 并且 System.currentTimeMillis() 返回 1605486656,您将散列 notmyaddressbutstilldarngood@domain.nice1605486656,returns 95e3dde92f8bb07e43b77c085f1ff2f166e1b9426f9b2f7a685171f4cd66b39c.所以您的网站 link 将是

www.abc.com/verify?id=95e3dde92f8bb07e43b77c085f1ff2f166e1b9426f9b2f7a685171f4cd66b39c