私が考える限り、ユーザーの忘れたパスワードをリセットするには、2つの合理的な方法があります。
ユーザーにメールアドレスを入力してもらうと、新しいプレーンテキストのパスワードがメールアドレスに送信されます。
リンクは、URLにUID番号が含まれているメールアドレスに送信されます。これをクリックすると、ユーザーはWebサイトのフォームに移動し、そこで独自の新しいパスワードを選択できます。
どの方法が好ましいのか、そしてその理由は?
方法1を使用する場合、おそらく第三者が電子メールを読んで新しいパスワードを取得する可能性があります。方法2を使用する場合、誰かがUIDコードを系統的に調べてフォームにアクセスし、ユーザーのパスワードを変更しようとするのを防ぐにはどうすればよいですか?
最適なパターンは次のとおりです。
ユーザーがパスワードのリセットを要求します。ユーザー名を使用して実行するのが最善であり、ユーザー名が存在するかどうかを示さないでください(スクリプトを介してユーザーがリストされる可能性を回避するため)
ユーザーID、リクエストの日時(=現在の日時)、および生成したばかりのGUID)を使用して、新しいデータベーステーブルにレコードを生成します。
GUID(ユーザーIDではない)をパラメーターとして使用して、パスワードリセットページを指定して、ユーザーにメールを送信します
このページで、GUIDが存在することを確認する必要があります。最終的には、有効期限を設定できます(=ユーザーは1日でリセットできます)。
ユーザーがパスワードをリセットするときに、レコードを「使用済み」(テーブルに追加のフィールドを含む)としてマークすることを忘れないでください。これにより、最終的な2回目の試行を停止できます...
それはおそらくもっと安全かもしれませんが、それはすでにかなり良いと思います..。
OWASPには、 https://www.owasp.org/index.php/Forgot_Password_Cheat_Sheet の適切なチェックリストがあります。
手順の概要は次のとおりです。
確認の質問をして、送信者が実際のユーザーであるかどうかを確認します。
Planateの従業員リストにない個人の電子メールでパスワードを送信しないでください。
電子メールのタイトルまたは本文に「パスワード」という単語を追加しないでください。
ユーザー名とパスワードは別々に送信してください。
Office 365ユーザーの場合は、パスワードを忘れた場合の領域に移動するか、このリンクを送信してください https://passwordreset.microsoftonline.com
ユーザーに脅迫されることなく、必要に応じてITマネージャーにエスカレーションしてください。