2016-11-20 5 views
0

私はパスワードを忘れたページを作成し、それを実行する最善の方法を見つけようとしています。現在、ユーザーがページに移動すると、そのユーザーの電子メールが尋ねられます。スクリプトは、アカウントが存在するかどうかを確認し、クリックしてパスワードをリセットするためのリンクを含む電子メールを送信します。PHPがパスワードを忘れてしまった

リンクには、トークン(ちょうどmd5(uniqid()))と、ユーザーが新しいパスワードを選択したときのデータベースと一致する電子メールアドレスが含まれています。このトークンはデータベーステーブルpassword_resetsに保存されます。有効期限は24時間後になり、アカウントの詳細には外部キーが格納されます。

ユーザーが新しいパスワードを選択すると、password_resetsテーブルのトークンと一致し、その外部キーの電子メールアドレスに電子メールが送信され、新しいパスワードを設定してレコードをpassword_resets

これは効率的な方法ですか?この目的のためにテーブル全体を用意することはほとんど冗長なようです。それを行うより良い方法はありますか?

+1

効率的ですが、問題はありません。古くなったトークンを洗い流すためのcronスクリプトを作成するだけです。あるいは、JWTトークンの実装を使用すると、データベースが不要になります。 – georoot

+3

話題はオフですが、 'uniqid()'は[暗号的に安全な値を生成しません](https://secure.php.net/manual/en/function.uniqid.php)ですので、代わりのランダム関数'uniqid() 'を一意に使用しているわけではなく、暗号化とは関係がありません。これは、一意のトークンとしてのみ使用されます(例:' openssl_random_pseudo_bytes() ' –

+1

@ this.lau_' md5(uniqid()これは完璧に適しています。彼らが言及しなかったり分からなかったりするものは、 'password_hash()'のような安全な(パスワード)ハッシュ関数を使用しています。私は質問が投稿したものを超えていると思う。ですから、 'openssl_random_pseudo_bytes()'は、サーバ上で使用できないかもしれません。 –

答えて

3

通常、私は同じ方法をお勧めしますが、同じ方法で効率的に書いたことに気付きました。そこactually.Iが大幅にデータベースの待ち時間を減らすことfollowingライブラリ

<?php 
    # $key is super secret 
    $key = "someRandomKey"; 
    function gen_token($email,$username) { 
     $token = array(
      "email" => $email, 
      "username" => $username, 
      "created" => time() 
     ); 
     return JWT::encode($token, $key); 
    } 

    function validate_token($token,$newPassword) { 
     # Step below only works on valid token generates on your server 
     $data = (array) JWT::decode($jwt, $key, array('HS256')); 
     $currentTime = time(); 
     # Validate difference between $currentTime and $data["created"] 
     # If time valid update password 
    } 
?> 

このメソッドを使用しています一つでも、あなたにトークン自体にいくつかの検証データを格納するためのオプションを提供することができます。

関連する問題