PHPで安全なアクティベーション文字列を生成するにはどうすればよいですか?
-
22-08-2019 - |
質問
ユーザーが私のウェブサイトにメールを購読した後。私のウェブサイトは確認メールを生成し、彼らに送信します。電子メールの内容には、次のようなアクティベーション キーを含める必要があります。
www.domain.com/activate.php?key=$generatedKey
鍵はどのように生成するのでしょうか?sha1($email) を使用しますか??
キーを生成した後、それをデータベースに保存して、ユーザーがリンクをクリックしたときにデータベースで検証できるようにします。初心者なのでアドバイスお願いします。電子メール確認スクリプトが必要です。
解決
個人的には、次のようなものを組み合わせて使用します。
$generatedKey = sha1(mt_rand(10000,99999).time().$email);
衝突の可能性は低いですが、送信する前にまずデータベースをチェックすることをお勧めします (UNIQUE 制約を使用するのが簡単な方法です)。
他のヒント
あなたは基本的にいくつかのオプションがあります:
1)それは
に対応したユーザ名、一見ランダムであり、単一の一意の識別子を作成し、データベースに保管されて2)ランダムなパスワードを生成し、リンクにユーザーIDとパスワードを含む、データベースにパスワードを保存
3)ユーザ識別子を暗号化するために一方向ハッシュ関数(MD5、SAH1など)と秘密識別子を使用します。あなたは、データベース内の暗号化されたユーザ識別子を格納する必要はありません。
あなたは、キーが既に存在するかどうかを確認するために、データベースをチェック心配する必要があるため、オプション1は困難です。しかし、URLが活性化されたユーザ名が含まれていないことをいいです。
あなたはすでに、将来的にユーザー情報(最低でもおそらくパスワード)を格納するデータベースのいくつかの並べ替えを使用しようとしている場合、それはあなたに別の列を追加するためにたくさん取ることはありません2.は、オプションで行くことができますデータベース。電子メールを送信する場合、ユーザ名を含む行のための別の列にユーザ名と$キー= SHA1(RAND(1、99999)。$ユーザ名)のようなものを保存します。そして、このようなあなたのリンクを見てみましょう: http://you.com/activation.php?user= $ユーザー名&キー= $キー。 activation.phpでは、キーはデータベースに格納されている値に等しいかどうかを確認します。
あなたは、データベースに少ないストレージ容量を使用する場合は、は、オプション3は動作します。あなたは秘密の識別子として$キー= SHA1($ mysecret。$ユーザ名)のようなものを使用することができます。唯一あなたがこのような「aaafj_my_secret_adfaf」としてとして$ mysecretを知っているという奇妙なものを使用してください。しかし、オプション2とURLの同じ種類を使用し、あなただけの$ユーザ名に基づいて、$キーを生成することができるので、あなたはそれを格納する必要はありません。ですから、activation.phpに処理しているとき、ちょうどSHA1かどうかを確認します($のmysecret。$ _GET [ユーザー名])== $ _GET [キー]。それがない場合、あなたは正しいユーザーを持って知っています。理論的には、十分に登録して、誰かが$ mysecretのためのあなたの価値を把握でき、あまりにもアクティベーションキーを生成します。しかし、あなたは確かに彼らはそれが何であるかを計算するために始めることができる前に、それがかかるだろう登録数十億以上に気づくでしょう。必要なアクティベーションの数は、ハッシュ関数のキーサイズに基づいています。それは難しいあなたの$ mysecret値を推測するために作るためにMD5(128ビット)対SHA1(160ビット)を使用します。
$guid=md5(uniqid(mt_rand(), true));
、あなたはすべてのハッシュを必要としない!
あなただけの長い間、ランダムな文字列を必要としています。あなたが欲しいしかし、あなたはちょうどそれが長い間作り、それを生成することができます。実際には、それは理想的には、電子メールまたはユーザ名で行うのですか、全く何もないはずです。
それを行う必要があること、しかし、あなたには、いくつかの塩、例を追加することによって、それを改善することができます:
$key = sha1($email . 'doYouLikeSauce');
他のアプローチは、単にランダムなパスワードを生成し、電子メールを介してそれを送信することです。
$code = md5($_POST['username'] . microtime());