【发布时间】:2014-02-10 20:51:50
【问题描述】:
我正在尝试制作一个小系统,让用户注册我的网站,然后他们会收到一封电子邮件,其中包含点击激活帐户的链接。
到目前为止,我正在考虑采用以下方式:
- 用户注册并按提交。
- 针对这个新的“非活动”帐户创建一个长随机字符串并将其放入数据库中。
- 一封电子邮件被发送到用户提供的地址,其中包含一个链接,上面写着“www.mysite.com/userclass/validationmethod/user@email.com/3423frqfafkop2341o43”。最后一位是验证码。
- 用户点击链接。
- 电子邮件和代码与刚刚创建的帐户相匹配。该帐户被标记为已验证/有效。
- 存储在数据库中的验证码被删除或标记为已使用??
您对此有何看法?这是最好的方法吗?作为一个额外的问题,我需要对那个电子邮件地址进行 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