19

ユーザーが私のウェブサイトに電子メールを購読した後。私のウェブサイトは確認メールを生成して送信します。メールの内容に、次のようなアクティベーションキーを含める必要があります。

www.domain.com/activate.php?key=$generatedKey

どのようにキーを生成しますか?sha1($ email)を使用していますか?

キーを生成した後、それをデータベースに保存します。これにより、ユーザーがリンクをクリックしたときに、データベースでキーを確認できますか?初めてですので、アドバイスしてください。メール確認スクリプトが必要です。

4

6 に答える 6

26

個人的には、次のようなものを組み合わせて使用​​します。

$generatedKey = sha1(mt_rand(10000,99999).time().$email);

衝突の可能性は小さいですが、送信する前にまずデータベースをチェックすることをお勧めします (UNIQUE 制約を使用するのが簡単な方法です)。

于 2009-05-18T03:34:07.037 に答える
8

基本的にいくつかのオプションがあります。

1)ランダムに見える単一の一意の識別子を作成し、対応するユーザー名でデータベースに保存します

2) ランダムなパスワードを生成し、ユーザー ID とパスワードをリンクに含め、パスワードをデータベースに保存します。

3) 一方向ハッシュ関数 (md5、sah1 など) と秘密の識別子を使用して、ユーザー識別子を暗号化します。暗号化されたユーザー識別子をデータベースに保存する必要はありません。

キーが既に存在するかどうかを確認するためにデータベースをチェックする必要があるため、オプション 1 は困難です。ただし、有効化するユーザー名が URL に含まれていないのは便利です。

将来、何らかのデータベースを使用してユーザー情報 (おそらく少なくともパスワード) を保存する予定がある場合は、オプション 2 を使用できます。データベースに別の列を追加するのにそれほど時間はかかりません。メールを送信するときは、ユーザー名と $key = sha1(rand(1, 99999) . $username) のようなものを、ユーザー名を含む行の別の列に保存します。次に、リンクをhttp://you.com/activation.php?user= $username&key=$key のようにします。activation.php では、キーがデータベースに保存されている値と等しいかどうかを確認します。

データベースで使用するストレージ スペースを減らしたい場合は、オプション 3 が有効です。$key = sha1($mysecret . $username) のようなものを秘密の識別子として使用できます。$mysecret として「aaafj_my_secret_adfaf」など、自分だけが知っている奇妙なものを使用します。オプション 2 と同じタイプの URL を使用します。ただし、$username のみに基づいて $key を生成できるため、保存する必要はありません。したがって、activation.php で処理しているときは、sha1($mysecret . $_GET[username]) == $_GET[key] かどうかを確認するだけです。存在する場合は、正しいユーザーを持っていることがわかります。理論的には、十分な数の登録があれば、誰かが $mysecret の値を割り出し、アクティベーション キーも生成することができます。ただし、それが何であるかを計算し始める前に、数十億以上の登録が必要になることに気付くでしょう。必要なアクティブ化の数は、ハッシュ関数のキー サイズに基づきます。$mysecret の値を推測しにくくするには、sha1 (160 ビット) と md5 (128 ビット) を使用します。

于 2009-05-18T04:34:21.087 に答える
1
$guid=md5(uniqid(mt_rand(), true));
于 2009-05-18T03:34:36.880 に答える
1

アクティベーション文字列をデータベースに保存して後で確認する場合、ハッシュはまったく必要ありません。

長いランダムな文字列が必要です。必要に応じて生成できますが、長くするだけです。実際、電子メールやユーザー名とはまったく関係がないことが理想的です。

于 2009-05-18T03:54:18.450 に答える
0

それでうまくいくはずですが、塩を追加することで改善できます。例:

$key = sha1($email . 'doYouLikeSauce');

もう 1 つの方法は、ランダムなパスワードを生成してメールで送信することです。

于 2009-05-18T03:34:50.783 に答える