验证链接通过电子邮件

时间:2010-07-13 13:11:04

标签: php mysql email activation

当用户使用php通过他们的电子邮件地址订阅我的简报时,我如何通过电子邮件向他们发送“激活链接”以确认它是他们的电子邮件地址而不是假的。

所以目前我已经

PHP:

<?php
 $to = "recipient@example.com";
 $subject = "Hi!";
 $body = "Hi,\n\nHow are you?";
 if (mail($to, $subject, $body)) {
   echo "<p>Message successfully sent!</p>";
  } else {
   echo "<p>Message delivery failed...</p>";
  }
 ?>

我想我会将$ body更改为:

$body = "Please click the link to activate your email \n
http://www.activationlink.com?";

我如何做到这一点,如果用户点击该链接,它会将他们的详细信息添加到Mysql数据库,以识别他们是合法用户?

任何帮助或建议表示赞赏。感谢

7 个答案:

答案 0 :(得分:11)

我喜欢做的是:

  • 在注册过程中生成唯一的随机ID

  • 将ID与电子邮件地址,“已确认”字段(默认值:“否”)以及数据库表格中的任何其他数据一起存储

  • 使用指向激活唯一ID的网址发送电子邮件(例如domain.com/activate.php?id=102939505595

  • 激活页面会检查唯一键是否存在,并将confirmed字段更改为yes(或1或其他)。

  • 此外,还可以选择保存确认日期/时间,IP地址和用户代理。

答案 1 :(得分:6)

将用户插入到设置了“pending”标志的表中(或未设置“validated”标志)。在更改标志之前,他们不应该做任何事情。如果你想要非常彻底,实际上将它们放入users_temp表中。生成完全随机的密钥并将其与用户ID相关联。您通过电子邮件发送给他们的链接应为http://yourwebsite.com/?activate=totallyrandomkeyigeneratedearlier。当您收到激活请求时,请使用相应的随机密钥为用户启用有效标记。

答案 2 :(得分:5)

不需要数据库。您可以发送散列

签名的超链接中的所有数据

即使过期时间,我最近也回答了类似的问题 虽然它是用于密码恢复链接,但想法是相同的

$token = sha1($time.$email.$salt).dechex(time()).dechex($user_id);
$link = "http://".$domain."/restorepass/?token=$token";

整个令牌看起来像单个十六进制数字,很难猜出它的含义。

收到后再拆分并解码回来 整洁,IMO。

答案 3 :(得分:1)

我个人会在数据库中添加详细信息,并有一个名为“active”的字段,然后当他们点击激活链接时,您需要做的就是更新这一个字段。

您也可以在电子邮件中找到“这不是我”链接,如果他们点击此链接,您将删除所有详细信息。

答案 4 :(得分:1)

生成一个唯一ID,并将其与用户名/密码一起存储在新用户的某些临时数据库条目中。

$tmpID = uniqid();

然后,调整eMail-body中的链接,例如:

$body = "Please click the link to activate your email \n
http://www.activationlink.com/activateAccount?activate=".$tmpID;

如果用户在您的服务器上请求/ activateAccount,请根据$_GET['activate']参数检查数据库条目,并将用户设置为激活(如果匹配)。

为了确保您的数据库不仅获得越来越多的条目,您可以使用一个cron-job来清除早于例如的条目。 24小时。

答案 5 :(得分:1)

首先,您需要在包含用户的数据库表中添加2列

该列应调用activeactivation_hash

当用户注册时,您需要将用户插入数据库,但将active设置为0,activation_hash成为用户email_address,first_name等随机md5的unique_id()在那里,确保它以MD5格式,然后将其存储在activation_hash列。

在您的电子邮件模板中添加要激活的用户的链接,例如:

<a href="http://mydomain.registrer.php?process=activate&id=<?php echo $user_id;?>&hash=<?php echo $activation_hash;?>">Activate your account</a>

然后在您的注册文件中或指向激活链接的任何地方,只需获取user_id&amp;通过$_GET激活哈希并对您的数据库进行验证。

如果它们不匹配,则要求用户输入其密码以发送另一个激活哈希。否则将列active设置为1,以便应用程序的其余部分知道用户的状态。

基本上就是那个。

答案 6 :(得分:0)

以下是我的完整解决方案:

CREATE TABLE signup  (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
email VARCHAR(30) NOT NULL,
token VARCHAR(30) NOT NULL,
verified VARCHAR(50),
registration_date TIMESTAMP,
maxdate TIMESTAMP
);

Signup MySQL Table

添加注册页面 signup.php

添加以下表格:

    <form name="signupform" method="post" action="process.php">
    Username:
    <input type="text" name="username">
    <br> Password:
    <input type="text" name="password">
    <br> Email:
    <input type="text" name="email">
    <br>
    <input type="submit" value="Signup">
</form>

创建 process.php 页面:

<?php
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
date_default_timezone_set('America/New_York');
$registration_date = date('Y-m-d H:i:s');
$verified = 0;
$maxdate = date('Y-m-d H:i:s', strtotime($registration_date . ' +1 day'));
$salt = uniqid(mt_rand() , true);
$token = msha1(registration_date . md5($salt));
$sql = "INSERT INTO signup (username, password, email, token, verified, registration_date, maxdate) VALUES ('$username', '$password', '$email', '$token', '$verified', '$registration_date', '$maxdate')";

if (mysqli_query($conn, $sql))
    {
    $msg = 'Please click this link to verify your email: http://www.yourdomain.com/verifyemail.php?token=' . $token;
    mail($email, $subject, $msg);
    }
  else
    {
    echo mysql_error();
    }

?>

之后创建 verifyemail.php

<?php
$token = $_REQUEST['token'];
date_default_timezone_set('America/New_York');
$current_time = date('Y-m-d H:i:s');
$sql = "SELECT * FROM users WHERE token='$token' AND maxtime >'$current_time' AND verified=0";
$result = mysqli_query($conn, $sql);
$notverified = mysqli_num_rows($result);

if ($notverified)
    {
    $sql = "update signup set verified=1 where token='$token'";
    $result = mysqli_query($conn, $sql);
    if ($result)
        {
        echo 'Email verified';
        }
      else
        {
        echo 'Error';
        }
    }
  else
    {
    echo 'Link expired';
    }

?>