【问题标题】:User account validation with code in an email link使用电子邮件链接中的代码验证用户帐户
【发布时间】:2014-02-10 20:51:50
【问题描述】:

我正在尝试制作一个小系统,让用户注册我的网站,然后他们会收到一封电子邮件,其中包含点击激活帐户的链接。

到目前为止,我正在考虑采用以下方式:

  1. 用户注册并按提交。
  2. 针对这个新的“非活动”帐户创建一个长随机字符串并将其放入数据库中。
  3. 一封电子邮件被发送到用户提供的地址,其中包含一个链接,上面写着“www.mysite.com/userclass/validationmethod/user@email.com/3423frqfafkop2341o43”。最后一位是验证码。
  4. 用户点击链接。
  5. 电子邮件和代码与刚刚创建的帐户相匹配。该帐户被标记为已验证/有效。
  6. 存储在数据库中的验证码被删除或标记为已使用??

您对此有何看法?这是最好的方法吗?作为一个额外的问题,我需要对那个电子邮件地址进行 urlencode 吗?


我已经选择了以下似乎运作良好的方法。只需添加数据库函数并对其进行排序:

public function verifyAccount($vCode, $email) {
        $email = urldecode($email);
        if($userId = $this->model->userIdByEmail($email))
        {
            $actualCode = $this->model->getUsersVerificationCodes('code', 'userId', $userId);
            if($actualCode != $vCode)
            {
                $output = 'Invalid code or email.';
            } else {
                $output = 'Success!';
            }
        } else {
            $output = 'Invalid code or email.';
        }

        echo $output;
}

【问题讨论】:

  • 我还会在 url 中包含一个唯一字段,例如用户 ID,因此 /userid/string,这将使您在匹配两个字段时对数据库的查询更轻松,而不是仅搜索一。它还消除了多个用户可能拥有相同的激活哈希/字符串的问题(发生这种情况的可能性不大,但有可能!)
  • 您不需要在 URL 中传递电子邮件地址。发送您已经保存在数据库中的唯一验证码。在验证过程中,请检查代码是否有效。如果找到有效代码,则更新用户验证状态。
  • @JoãoFerreira 你认为我应该保留验证码并将其标记为已使用吗?我也可以在上面写一个日期,这样我就可以设置到期时间了?
  • @imperium2335 可能有用的很多网站正在发送仅在 48 小时内有效的电子邮件验证或其他时间。但是根据您期望的用户数量,您应该考虑必须保留在数据库中的数据量
  • 您有很多可能性,也许您应该在用户表中创建另一个字段以将用户标记为已激活,或者激活日期字段,或者只是清除哈希/字符串字段(空)。 ..

标签: php email user-interface registration email-validation


【解决方案1】:

对我来说看起来不错,我也会这样做。但我不会使用链接中的电子邮件。改用这样的东西: mysite.com/confirm_email/749c71f6a29220a3ec168df

编辑:我认为您不需要对电子邮件进行 urlencode,但是当您这样做时,处理地址可能会更容易。

我认为另一种可能的选择是:

mysite.com?email=urlencoded_email&confirm=u34h23ui4h234 取决于您如何处理 url 参数。

【讨论】:

  • +1 好点。我想我不需要电子邮件地址,因为它不像有人会猜测别人帐户的大随机字符串。
  • 如果你有just“大随机字符串”,那么我只需要用足够多的随机字符串来填充你的脚本以获得any i> 帐户迟早会激活……因此您还应该传输一些可以识别相关帐户的信息(电子邮件或 ID)以防止这种情况发生。
  • @CBroe 同意,除了代码而不是用户 ID 之外,我还要发送电子邮件。我认为电子邮件比只是一个数字的 id 要好得多,还是你认为它们是一样的?
  • 这实际上很有趣。如果一个人想注册一封伪造的电子邮件,那么如果您在链接中也有该电子邮件,这有什么区别?他们在注册时创建了那封伪造的电子邮件,所以他们会知道并把它放进去,然后他们运行一个脚本来猜测字符串,现在就像没有电子邮件一样。所以,真的把电子邮件放进去是没有意义的。
【解决方案2】:

我想说将电子邮件地址放在链接中是没有意义的。如果一个人在创建假电子邮件后想弄清楚这一点,那么已经知道假电子邮件并将其添加到他们将向您的服务器发送垃圾邮件以猜测随机数的链接。所以只要有(大)随机数(尽可能随机)。

但是,您应该做的是放置一个过期字段以进行验证。您应该只使该随机数有效一个小时左右。如果他们在一小时后点击该链接,则该链接不再有效。这有助于打击黑客,因为如果他们猜测他们需要时间,并且他们注册的每个虚假帐户都会获得一个新的随机数,并且只有 1 小时的猜测时间。如果你能得到一个很长很好的随机数,应该可以更好地对抗黑客。

在您的电子邮件中有一个支持链接,供用户请求另一个验证码并手动处理,这样您就可以看到发生的任何模式。这应该经常发生。

【讨论】:

    猜你喜欢
    • 2011-03-06
    • 2023-04-01
    • 2014-08-17
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多