web-dev-qa-db-ja.com

PHPで安全なアクティベーション文字列を生成する方法は?

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

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

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

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

19
show_lol

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

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

衝突の可能性はわずかですが、送信する前にまずデータベースを確認することをお勧めします(UNIQUE制約を使用するのが簡単な方法です)。

25

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

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)のようなものを使用できます。 'aaafj_my_secret_adfaf'のように、あなただけが$ mysecretとして知っている奇妙なものを使用してください。オプション2と同じタイプのURLを使用します。ただし、$ usernameのみに基づいて$ keyを生成できるため、保存する必要はありません。したがって、activation.phpで処理しているときは、sha1($ mysecret。$ _ GET [username])== $ _GET [key]かどうかを確認してください。もしそうなら、あなたはあなたが正しいユーザーを持っていることを知っています。理論的には、十分な登録があれば、誰かが$ mysecretの値を把握し、アクティベーションキーも生成する可能性があります。しかし、彼らがそれが何であるかを計算し始めることができる前にそれが取るであろう何十億以上の登録に確かに気付くでしょう。必要なアクティベーションの数は、ハッシュ関数のキーサイズに基づいています。 $ mysecret値を推測しにくくするには、sha1(160ビット)とmd5(128ビット)を使用します。

8
mattk
$guid=md5(uniqid(mt_Rand(), true));

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

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

1
Eli
$code = md5($_POST['username'] . microtime()); 
0