web-dev-qa-db-ja.com

忘れたユーザーパスワードをリセットするためのベストプラクティス

私が考える限り、ユーザーの忘れたパスワードをリセットするには、2つの合理的な方法があります。

  1. ユーザーにメールアドレスを入力してもらうと、新しいプレーンテキストのパスワードがメールアドレスに送信されます。

  2. リンクは、URLにUID番号が含まれているメールアドレスに送信されます。これをクリックすると、ユーザーはWebサイトのフォームに移動し、そこで独自の新しいパスワードを選択できます。

どの方法が好ましいのか、そしてその理由は?

方法1を使用する場合、おそらく第三者が電子メールを読んで新しいパスワードを取得する可能性があります。方法2を使用する場合、誰かがUIDコードを系統的に調べてフォームにアクセスし、ユーザーのパスワードを変更しようとするのを防ぐにはどうすればよいですか?

13
Lars

最適なパターンは次のとおりです。

  1. ユーザーがパスワードのリセットを要求します。ユーザー名を使用して実行するのが最善であり、ユーザー名が存在するかどうかを示さないでください(スクリプトを介してユーザーがリストされる可能性を回避するため)

  2. ユーザーID、リクエストの日時(=現在の日時)、および生成したばかりのGUID)を使用して、新しいデータベーステーブルにレコードを生成します。

  3. GUID(ユーザーIDではない)をパラメーターとして使用して、パスワードリセットページを指定して、ユーザーにメールを送信します

  4. このページで、GUIDが存在することを確認する必要があります。最終的には、有効期限を設定できます(=ユーザーは1日でリセットできます)。

  5. ユーザーがパスワードをリセットするときに、レコードを「使用済み」(テーブルに追加のフィールドを含む)としてマークすることを忘れないでください。これにより、最終的な2回目の試行を停止できます...

それはおそらくもっと安全かもしれませんが、それはすでにかなり良いと思います..。

42
Laurent S.

OWASPには、 https://www.owasp.org/index.php/Forgot_Password_Cheat_Sheet の適切なチェックリストがあります。

手順の概要は次のとおりです。

  1. IDデータまたはセキュリティの質問を収集する
  2. セキュリティの質問を確認する
  3. サイドチャネルを介してトークンを送信する
  4. ユーザーがパスワードを変更できるようにする
12
rmblstrp

確認の質問をして、送信者が実際のユーザーであるかどうかを確認します。

Planateの従業員リストにない個人の電子メールでパスワードを送信しないでください。

電子メールのタイトルまたは本文に「パスワード」という単語を追加しないでください。

ユーザー名とパスワードは別々に送信してください。

Office 365ユーザーの場合は、パスワードを忘れた場合の領域に移動するか、このリンクを送信してください https://passwordreset.microsoftonline.com

ユーザーに脅迫されることなく、必要に応じてITマネージャーにエスカレーションしてください。

0
JERNY SAMALA