12

ユーザーはパスワードを忘れてしまい、(ほぼ) すべてのメンバーシップ サイトには、ユーザーが再びログインできるようにする方法が必要です。

一般的なシナリオを実装したいと思います:

  1. ユーザーがサイトにアクセスし、ログインしようとしてログインできず、パスワードを忘れたことに気付きました。
  2. ユーザーがメールアドレスを入力し、「パスワードを忘れた」をクリックします
  3. ユーザーは、パスワード リセット リンクが記載された電子メールを受け取ります

これを実装する方法を次に示します (C#/ASP.NET MVC):

  1. ユーザーが電子メールを入力して「パスワードを忘れた」ボタンを押すと、私のサイトは GUID を生成し、それをメンバーのエンティティの DB ( member.ResetToken) に保存し、URL にその GUID を含むリンクを電子メールで送信します (送信された電子メールは、このリンクは 1 回のみ使用できます)
  2. member.ResetTokenユーザーがリンクをクリックすると、サイトはその URLに基づいて自分のアカウントを検索します。アカウントが見つかった場合は、パスワード リセット フォームを提示し、リセットが完了するとmember.ResetToken、アカウントから がクリアされます。

これが私の質問です: このままにしておくか (現在または将来いつでもそのリンクでパスワードをリセットできます)、またはタイムスタンプを追加して、パスワードをリセットする必要がある期間を制限しますか?

UX の観点からは、準備ができたらいつでもパスワードをリセットできることは素晴らしいことですが、これによって発生する可能性のあるセキュリティ上の問題を見落としていないことを確認したいと思います。

4

4 に答える 4

2

したがって、このアプローチには、コメントで回避しようとしていたいくつかの問題があります。「確認トークン」をユーザーのパスワードに保存すると、基本的にパスワードを破棄したことになります。

悪意のある私は、電子メール アドレスの巨大なリストとボット ネットを取得し、パスワードのリセット要求でサーバーをあふれさせ、ユーザーをアカウントから締め出すことができます。確かに、ユーザーはリセットのための電子メールを受け取りますが、パスワードを十分に迅速にリセットできれば、電子メールのバックログが発生する可能性があります (または、同期的に行う場合は、アプリケーション全体を DoS できる可能性があります)。

あなたのシステムの通常のユーザーである私は、自分のパスワードをリセットしようとするかもしれませんが、スパム フォルダーについても知らない (または届かない) ため、リセット メールが届かない理由がわかりません。幸いなことに、パスワードが何であるかを思い出しましたが、パスワードが不透明な GUID になったため、もう機能しません。リセット メールが見つかるまで、私は基本的に水の中で死んでいます。

使用する必要があるプロセスは次のとおりです。

  1. GUID を使用して検索するパスワード リセット リクエストを生成します。また、その値をいくつかのプライベート データでハッシュし、それを URL にも渡して迅速な攻撃を回避することで、これを保護することもできます。このリクエストを一定期間のみ有効にすることで、このリクエストをロックダウンすることもできます。
  2. 誰かが有効なトークンと指定したその他のパラメーターを使用してそのリンクをたどると、パスワードを変更できるようになり、その時点でユーザーのパスワードを安全に変更できるようになります
  3. パスワード要求に完了のフラグを立てるか、削除してください。誰がパスワードを変更したかを本当に心配している場合は、IP アドレスなどの情報を追跡することもできます。
  4. パスワードを変更したことを確認する電子メールをユーザーに送信します。

また、これがまだ発生していない場合に備えて、ユーザーのパスワードをハッシュおよびソルトしていることを確認してください。パスワードをGUIDに置き換えたばかりのときにそうしていたようには聞こえないので、再確認してください。

于 2013-10-09T03:20:16.153 に答える
1

ユーザーはパスワードのリセットも忘れます (事が起こります)。パスワードについて偏執的であるため、リンクの有効期間を 24 時間に制限することをお勧めします。これで十分です。悪意のある傍受の問題は解決しませんが、何もないよりはましです。

于 2013-10-09T03:08:04.477 に答える
1

私は次の提案をします:

  1. ユーザーがパスワードを忘れた場合のボタンをクリックできるようにする前に、いくつかの情報を要求します。たとえば、電子メール アドレスと生年月日を要求します。

    理想的には、ユーザー インターフェイスは、ハッカーがリセット リクエストが成功したかどうかを判断できるようなフィードバックを提供しないようにする必要があります。メールアドレスや生年月日のためにあなたのページをファーミングしたくありません. ただし、これは使いやすさとのトレードオフであるため、これを行うかどうかは、実際にどれだけのセキュリティが必要かによって異なります。

    また、ブルート フォース攻撃やアプリケーション DoS 攻撃をより困難にするキャプチャを要求することを検討することもできます。

  2. ワンタイム トークンをできるだけ早く期限切れにします。私の意見では、数時間で十分です。電子メールをプライベートなものと考えてはいけません。ベース プロトコル上で安全な電子メール テクノロジ (PGP など) を使用している場合を除きます (ほとんどの人は使用していません)。あなたが望む最後のことは、あなたの GUID が売買される闇市場が開かれることです。

  3. GUID は使用しないでください。それらは暗号学的にランダムではなく、推測可能です。暗号乱数ジェネレーターを使用して base64 に変換することをお勧めします。

于 2013-10-09T23:43:34.907 に答える