使用电子邮件链接中的代码验证用户帐户

时间:2014-01-21 10:13:40

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

我正在尝试建立一个用户注册我的网站的小系统,他们会收到其中一个电子邮件,其中包含一个链接,用户可以点击这些电子邮件激活他们的帐户。

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

  1. 用户注册并按提交。
  2. 创建一个长随机字符串,并将其放入数据库中,以防止这个新的“非活动”帐户。
  3. 电子邮件将发送到用户提供的地址,其中包含指向“www.mysite.com/userclass/validationmethod/user@email.com/3423frqfafkop2341o43”的链接。最后一位是验证码。
  4. 用户点击该链接。
  5. 电子邮件和代码与刚刚创建的帐户相匹配。该帐户已标记为已验证/有效。
  6. 存储在数据库中的验证代码将被删除或标记为已使用??
  7. 您对此有何看法?这是最好的方法吗?作为一个额外的问题,我是否需要对该电子邮件地址进行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;
    }
    

2 个答案:

答案 0 :(得分:2)

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

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

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

mysite.com?email=urlencoded_email&confirm=u34h23ui4h234取决于您处理网址参数的方式。

答案 1 :(得分:0)

我认为将电子邮件地址放在链接中是没有意义的。如果有人想在他们创建假电子邮件之后想出这个,那么就已经知道假电子邮件并将其添加到链接中,他们将向您的服务器发送垃圾邮件以猜测随机数。所以只需要(大)随机数(随机获得)。

但是,您应该做的是为验证设置一个到期字段。您应该只使该随机数有效一个小时左右。如果他们在一小时后点击该链接,那么它就不再有效了。这有助于打击黑客,因为如果他们猜测他们需要时间和他们注册的每个假账户他们会得到一个新的随机数,只有1小时的猜测时间。如果你能得到一个非常长且好的随机数,那么它应该可以更好地对抗黑客。

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