Troy Huntは彼の記事「安全なパスワードリセット機能の構築について知りたかったすべて」でいくつかの優れた点を述べています。最も関連する抜粋は次のとおりです。
[T] 2つの一般的なアプローチは次のとおりです。
- サーバーで新しいパスワードを生成してメールで送信する
- リセットプロセスを容易にする一意のURLをメールで送信する
それと反対のガイダンスはたくさんありますが、最初のポイントは、私たちがなりたい場所ではありません。これを行う際の問題は、永続的なパスワード(いつでも使用でき、いつでも使用できるパスワード)が安全でないチャネルを介して送信され、受信トレイに存在することを意味することです。
...
しかし、最初のアプローチには、アカウントの悪意のあるロックアウトを非常に簡単にするという大きな問題がもう1つあります。ウェブサイトでアカウントを所有している人のメールアドレスがわかっている場合は、パスワードをリセットするだけで、いつでもロックできます。銀の大皿にサービス拒否攻撃が仕掛けられます。このため、リセットは、要求者がリセットする権利を正常に確認した後にのみ発生するものです。
リセットURLとは、リセットプロセスのこの特定のインスタンスに固有のWebサイトアドレスのことです。
...
私たちがやりたいことは、リセットURLの一部としてメールで送信できる一意のトークンを作成し、ユーザーのアカウントと一緒にサーバー上のレコードと照合して、メールアカウントの所有者が実際にリセットしようとしていることを確認することですパスワード。たとえば、トークンは「3ce7854015cd38c862cb9e14a1ae552b」で、リセットを実行しているユーザーのIDとトークンが生成された時刻(さらに詳しくは、後で)とともにテーブルに格納されます。電子メールが送信されると、「Reset /?id = 3ce7854015cd38c862cb9e14a1ae552b」などのURLが含まれ、ユーザーがこれをロードすると、ページはトークンの存在を確認し、その結果、ユーザーのIDを確認してパスワードに許可します。変更されます。
...
リセットURLで実行したいもう1つのことは、トークンを時間制限することです。これにより、リセットプロセスを一定の時間内、たとえば1時間以内に完了する必要があります。
...
最後に、これが1回限りのプロセスであることを確認します。リセットプロセスが完了したら、トークンを削除して、リセットURLが機能しなくなるようにする必要があります。前のポイントと同様に、これは、攻撃者がリセットされたURLを悪用できる非常に限定されたウィンドウを確実にするためです。もちろん、リセットプロセスが正常に完了した場合、トークンは不要です。
彼は、情報漏えい、CAPTCHA、2要素認証、そしてもちろんパスワードハッシュのような基本的なベストプラクティスを回避することについて、さらに多くの優れた点を述べています。セキュリティに関する質問の有用性については私がトロイに同意しないことに注意することが重要だと思います。ブルース・シュナイアーの実践に対する懐疑論を好むのです。
これらすべての質問の要点は同じです。バックアップパスワードです。パスワードを忘れた場合、秘密の質問で本人確認を行うことができるため、別のパスワードを選択するか、サイトに現在のパスワードを電子メールで送信することができます。これはカスタマーサービスの観点からは素晴らしいアイデアです。ユーザーはランダムなパスワードよりも最初のペットの名前を忘れる可能性は低いですが、セキュリティ上はひどいものです。秘密の質問に対する答えは、適切なパスワードよりも推測がはるかに簡単で、情報ははるかに公開されます。