私はパスワードを忘れたページを作成し、それを実行する最善の方法を見つけようとしています。現在、ユーザーがページに移動すると、そのユーザーの電子メールが尋ねられます。スクリプトは、アカウントが存在するかどうかを確認し、クリックしてパスワードをリセットするためのリンクを含む電子メールを送信します。PHPがパスワードを忘れてしまった
リンクには、トークン(ちょうどmd5(uniqid())
)と、ユーザーが新しいパスワードを選択したときのデータベースと一致する電子メールアドレスが含まれています。このトークンはデータベーステーブルpassword_resets
に保存されます。有効期限は24時間後になり、アカウントの詳細には外部キーが格納されます。
ユーザーが新しいパスワードを選択すると、password_resets
テーブルのトークンと一致し、その外部キーの電子メールアドレスに電子メールが送信され、新しいパスワードを設定してレコードをpassword_resets
。
これは効率的な方法ですか?この目的のためにテーブル全体を用意することはほとんど冗長なようです。それを行うより良い方法はありますか?
効率的ですが、問題はありません。古くなったトークンを洗い流すためのcronスクリプトを作成するだけです。あるいは、JWTトークンの実装を使用すると、データベースが不要になります。 – georoot
話題はオフですが、 'uniqid()'は[暗号的に安全な値を生成しません](https://secure.php.net/manual/en/function.uniqid.php)ですので、代わりのランダム関数'uniqid() 'を一意に使用しているわけではなく、暗号化とは関係がありません。これは、一意のトークンとしてのみ使用されます(例:' openssl_random_pseudo_bytes() ' –
@ this.lau_' md5(uniqid()これは完璧に適しています。彼らが言及しなかったり分からなかったりするものは、 'password_hash()'のような安全な(パスワード)ハッシュ関数を使用しています。私は質問が投稿したものを超えていると思う。ですから、 'openssl_random_pseudo_bytes()'は、サーバ上で使用できないかもしれません。 –