8

ユーザーが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 データベースに詳細を追加するにはどうすればよいですか?

ヘルプや提案をいただければ幸いです。ありがとう

4

7 に答える 7

13

私がやりたいことは次のとおりです。

  • 登録プロセスで一意のランダム ID を生成する

  • ID を電子メール アドレス、「確認済み」フィールド (デフォルト: 「いいえ」)、および追加データと共にデータベース テーブルに保存します。

  • 一意の ID をアクティブ化するための URL を含む電子メールを送信します (例:domain.com/activate.php?id=102939505595

  • アクティブ化ページは、一意のキーが存在するかどうかを確認し、confirmedフィールドをyes(または1その他) に変更します。

  • さらに、必要に応じて、確認の日時、IP アドレス、およびユーザー エージェントを保存します。

于 2010-07-13T13:15:28.093 に答える
6

「保留」フラグが設定された (または「検証済み」フラグが設定されていない) テーブルにユーザーを挿入します。フラグが変更されるまで、彼らは何もできないはずです。本当に徹底したい場合は、実際にそれらを users_temp テーブルに入れます。完全にランダムなキーを生成し、ユーザー ID に関連付けます。メールで送信するリンクはhttp://yourwebsite.com/?activate=totallyrandomkeyigeneratedearlier. アクティベーション要求を受け取ったら、対応するランダム キーを持つユーザーの有効フラグをオンにします。

于 2010-07-13T13:13:52.193 に答える
6

データベースは必要ありません。ハッシュで署名されたハイパーリンク内のすべてのデータを送信できます

最近、有効期限があっても同様の質問に答えました。
パスワード回復リンク用でしたが、考え方は同じです

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

トークン全体が 1 つの 16 進数のように見え、その意味を推測するのは困難です。

受信すると、分割してデコードして戻します。
ニート、IMO。

于 2010-07-13T13:22:13.113 に答える
1

個人的には、データベースに詳細を追加し、「アクティブ」と呼ばれるフィールドを用意して、アクティブ化リンクをクリックすると、この 1 つのフィールドを更新するだけで済みます。

電子メールに「これは私ではありません」というリンクを含めることもできます。これをクリックすると、そこにあるすべての詳細が削除されます。

于 2010-07-13T13:15:59.853 に答える
1

一意の ID を生成し、これをユーザー名/パスワードと共に、新しいユーザーの一時的なデータベース エントリ内に保存します。

$tmpID = uniqid();

次に、メール本文のリンクを次のように変更します。

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

ユーザーがサーバーで /activateAccount を要求した場合は、データベース エントリを$_GET['activate']パラメーターと照合し、ユーザーをアクティブに設定します (一致する場合)。

データベースがますます多くのエントリを取得しないようにするために、たとえば 24 時間よりも古いエントリをクリアする cron ジョブを使用できます。

于 2010-07-13T13:18:20.590 に答える
1

まず、ユーザーを保持するデータベース テーブルに 2 つの列を追加する必要があります。

列が呼び出されactiveactivation_hash

ユーザーが登録されたら、ユーザーをDBに挿入する必要がありますが、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とアクティベーションハッシュを取得し$_GET、データベースに対して検証します。

一致しない場合は、パスワードを入力して別のアクティベーション ハッシュを送信するようにユーザーに依頼します。それ以外の場合は、列activeを 1 に設定して、アプリケーションの残りの部分がユーザーのステータスを認識できるようにします。

それは基本的にそれです。

于 2010-07-13T13:19:02.570 に答える
1

これが私の完全なソリューションシナリオです:

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
);

サインアップ MySQL テーブル

サインアップページを追加する 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';
    }

?>
于 2016-12-23T00:03:40.903 に答える