web-dev-qa-db-ja.com

パスワードを忘れて、アカウントが存在するかどうかを明らかにする

そのため、パスワードを忘れた場合のリンクをクリックしてメールアドレスを入力すると、サイト(および私が話を聞いた他のプログラマー)は2つの考え方のうちの1つであるように見えます。

  • 電子メールアドレスがデータベース内のアドレスと一致したかどうかをユーザーに通知し、このアドバイスに基づいて、パスワードのリセット電子メールが設定されたかどうかを通知します。
  • 一致が発生してメールが送信されたかどうかに関係なく、すぐに「メールを送信しました」または「このユーザーが存在する場合は、パスワードのリセットメールを送信しました」で応答します。これは、セキュリティ上の理由から(明らかに)行われます。

私は後者を自分で実装しましたが、一般にそれが原因でユーザーに不快感を与えたことがわかりました。

  1. ユーザーがメールアドレスを誤って入力すると、メールが送信されたことが通知されますが、受信することはありません。
  2. 登録したメールアドレスとは異なるメールアドレスを入力した場合も、メールは届きません。
  3. 上記の組み合わせにより、複数回の試行が発生する可能性がありますが、パスワードのリセットメールを受信せず、結果として中止されます。

最後に、2番目のシナリオを使用する人気のあるWebサイトを調査したところ、入力した電子メールアドレスが既存のアカウントと一致するこれらのサイトにアカウントを登録しようとすると、「この電子メールアドレスはすでに使用されているか、利用できない」タイプであることがわかりましたとにかくメッセージが表示されます。

このように、パスワードリセットメールがアカウントと一致したかどうかを明らかにしない利点は何ですか?また、登録でメールの一致を明らかにする必要がある場合、これらの利点はどのように役立ちますか?

23

セキュリティと使いやすさの間にはトレードオフがある場合があります。

他の人が自分がサイトを使用していることを知らないことがあなたやユーザーにとって重要な場合は、2番目の選択肢が最適です。

「誰かがこのアドレスのパスワードのリセットを要求したが、私たちのシステムにはない」のように、システムに存在しないアドレスにいつでもメールを送信できます。これで2番目の苦情が処理されます。

確認ページでパスワードのリセットをやり直すためのリンクを追加します。うまくいけば、次回はメールを正しく入力できます。

したがって、ユーザーの列挙を回避することが、誤って入力された電子メールアドレスよりも重要かどうかを判断します。

パスワードリセットのメールがアカウントと一致したかどうかを明らかにしない利点は何ですか

ユーザーのメールアドレスのリストを攻撃者に提供または確認したり、特定のユーザーがサイトを使用していることを他の人に知らせたりしないでください。それが子猫に関するサイトなら、誰が気にしますか?銀行や婚外関係のサイトの場合、これは重要です。

登録でメールの一致を明らかにする必要がある場合、これらはどのように役立ちますか?

登録にはこれが必要だと誰が言いますか?登録も同様です。メールアドレスをリクエストする、「ステップ2」リンクを送信する、または「誰かが当サイトでの登録をリクエストしたが、このアドレスはすでに登録されている」メール。

13
Neil McGuigan

したがって、簡単にアクセスできる方法でシステム上の電子メールの存在を確認または拒否した場合に、攻撃者が実際に何ができるかを検討する必要があることを私は入門書として推測します。これは可能なシナリオです:

  • 攻撃者は、侵害された電子メールアドレスとパスワードのデータベースにアクセスしました。 (つまり、これらのユーザーのメールにログインできます)
  • 彼らはあなたのサービスであなたのユーザーのアカウントのいくつかにアクセスしたいと考えています。
  • サービスは、メールアドレスを持つアカウントが存在するかどうかを確認または拒否します。

この場合、データベースにあるすべての電子メールをパスワードリセット機能に対して単純に試し、返された結果を収集し、それらのいずれかが存在することを確認したら、それらの電子メールにログインして、パスワードリセットリンクをたどります。

サインアッププロセスをたどるのが簡単な場合は、パスワードのリセットが不透明であるためにセキュリティが強化されないと想定するのは正しいことです。パスワードリセットページではなく、サインアップページで前述の攻撃を簡単に実行できます。

これを軽減するために考えられるいくつかの方法は次のとおりです。

  • ユーザーがユーザー名でサインアップするか、登録時にユーザー名を割り当てるように強制し、それ以降、ユーザーにメールアドレスではなくそれを使用させる。
  • 確認メールをクリックするまで、ログインを許可しないでください。こうすることで、すでに登録されているメールで誰かがサインアップしようとした場合は、「確認メールをあなたのメールアドレスに送信しました。クリックしてログインしてください」と言うだけです。
  • CAPTCHAなど、電子メールアドレスの存在を確認または拒否できるページに、ある種の総当り攻撃方法を実装しようとします。

ただし、前述のとおり、これらはどちらも使いやすさに比較的大きな影響を与えます。いつものように、セキュリティは常に実用性と偏執狂の間のトレードオフです。

2
Nic Barker

これまでの回答は良好ですが、プロファイリングの観点からは、アカウントにアクセスしなくてもかまいませんが、サービスを使用しているという知識は状況をソーシャルエンジニアリングするのに十分であることに注意することが重要です/潜在的なパスワード(ペット、子供、車など)のソーシャルフィードを監視します。

とは言っても、ユーザーのサインアップ中に、ユーザーに電子メールアドレスが既に使用されている場合とされていない場合があることをユーザーに説明するのは、不適切なUXの動き(または少なくとも地雷原)になるでしょう。アカウントを再作成して、「既にアカウントを持っているようです」とメールで送信するというファンキーなロジックを考え出すこともできますが、それは不格好であり、率直に言って、ユーザーにとっては時間の無駄です。同じことがログインページにも当てはまります。アカウントの有無にかかわらず「無効なユーザー/パス」は良い習慣です...しかし、登録ページが自由に情報を提供し、ユーザーがユーザーを不快に思う危険性がある場合登録しましたが、登録していません。

個人的には、このシナリオが発生しないように、Webベースのサービスで可能な限りOpenIDを使用するようにしています。最近、Google/Facebook/Twitterアカウントを持っています...

2
ScottMcGready