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