私は自分のWebアプリのオンボーディング機能に取り組んでおり、ある時点で新しいユーザーにユーザー名を選択するように求めています。
ユーザーがこの時点に到達すると、SMSで検証された彼/彼女の電子メールと携帯電話番号があり、彼/彼女はGoogleのCAPTCHA reCAPTCHAを通過していません。
選択したユーザー名がすでに存在するかどうかを確認する必要があります。存在する場合、ユーザーは別のユーザー名を選択するように求められます。
Webを閲覧しているときに、そのような機能を実装するとユーザー名が存在するかどうかを確認するためのツールも攻撃者に提供されるというページに出くわしました。
ユーザー名が存在するかどうかを確認するためのベストプラクティスは何ですか?
このソース は、この状況でユーザーの列挙を回避することはほぼ不可能であり、攻撃者を遅らせることが最善の方法だと述べています。
あなたが開発者であれば、この種の攻撃からサイトをどのように保護できるのか疑問に思うかもしれません。まあ、アカウントサインアップ機能をユーザー名列挙の影響を受けないようにすることは事実上不可能ですが、CAPTCHAメカニズムを実装することで、それに対する自動ユーザー名列挙攻撃を回避することができます。
しかし、私は何かを見逃したかもしれません-他の誰かがより良い解決策を持っているかどうかも知りたいです。
そのシステムで実際に何が起こるか
それは良くないね。したがって、複数のユーザーが同じユーザー名を持つことを防ぐ必要があります。チェックすることでこれを行います。
これは提示されたシナリオであり、悪意のあるユーザーによる悪用を防ぐにはどうすればよいですか。ここまであなたはどんなリスクを冒していますか?
わかりました。これにより、セキュリティが少し強化され、ユーザーが電子メールやその他の機密情報を漏洩するのを防ぐことができます。しかし今、あなたは攻撃を試みて軽減したいと思います。どうやってやるの?
それを防ぐためにここに存在するいくつかのテクニックがありますが、断然最善の方法は、IPによってログに記録するレート制限と最大試行です。
ユーザーが登録しようとすると、利用可能なユーザー名のチェックが非常に速くなります。実際には、実際の人が1〜2秒で新しいユーザー名を入力する必要があります。これにより、いくつかの簡単なチェックとバランスを実行できます。ただし、これは実際に登録しようとしたときにのみ発生します。ユーザーがあなたを攻撃し、登録されていないユーザー名を使用すると、発生するのはそのユーザーがそのユーザー名を登録したことだけです。しかたがない。今、彼らは登録プロセスを最初からやり直す必要があり、ここで確認できます。
これで、攻撃者は自分自身を公開し、IPレベルで禁止されました。あなたはここで何か悪いことが起こっていることを知っています。よくやった!
ただし、他のアカウントを見つけるために作成されたすべてのアカウントに戻って登録を解除する必要があります。あなたがそれらのログを持っているのは良いことです!
アカウントをメールに関連付けない場合に注意する必要がある大きな欠陥は次のとおりです:ユーザー名を事前登録して身代金のために保留することができます 。その場合、ユーザー名の所有権を証明することは非常に困難です。これは、誰かがあなたのシステムに対して異なるタイプの攻撃をして、たくさんの人のアカウントを事前登録し、身代金を要求しようとするだけです。うまくいけば、あなたは上記のチェックからのログを持っているので、あなたは行為でそれらを試すことができます。
メールの確認プロセスはすでに完了しているとのことですが、この時点でメールを処理する別の方法は、メールにリンクすることです。登録後、メールを変更したい場合は、ログインして、メールへのリンクを含むリクエストを送信して変更する必要があります。これは、時間に依存するトークンを使用して実行できます。これで、サイトに表示するユーザー名も設定できるようになりました。表示名が重複している可能性があり、その情報を使用して別のアカウントにアクセスする方法がないため、ここでの落とし穴も緩和されますが、電子メールは真実のチェックを提供します(そしておそらくプロフィール写真のようなある種の物理的識別子)
ユーザーがログインしようとすると、ユーザー名が入力されます。登録すると、ユーザー名を取得したかどうかが通知されます。使用したユーザー名を見つけた場合は、そのユーザー名でログインしてハッキングする可能性があります。
別の問題でもある解決策:
彼らが電子メールでログインする必要があった場合、ユーザー名が使用されているかどうかの知識は役に立たない-ユーザー名ではなく電子メールでログインするので、電子メールのテキストフォームに何を入力するかわからないhelloman
ユーザー名があることを知っています。しかし今、問題はユーザーに電子メールが取得されたかどうかを伝えることです。
解決策-登録時に、電子メールが取得されたかどうかを知らせずに、確認メールが送信されたことを伝えます。誰かが自分のメールを登録しようとしたというメールを送信する前にメールが登録されている場合は、メールを送信します。登録しようとした場合[email protected]
は、hellomanの電子メールの受信トレイが表示されないため、本当のhellomanではありません。そして、本物のハローマンがすでに登録されているメールで新しいアカウントを作成しようとした場合、彼だけがすでに登録されていることを知らせるメールを受け取ります。 hellomanをハッキングしたハッカーがいない場合を除いて、hellomanなどの多くの人は愚かではなく、password
をパスワードとして使用しません。また、最近の最も一般的な電子メールシステムは非常に安全であるため、心配する必要はありません(そして、彼がそれをハッキングした場合、それは私たちの問題ではありません(あなたとあなたのスタッフのために独自のメールサーバーをセットアップした場合))。
ユーザー(または攻撃者)がユーザー名が存在するかどうかを確認できるようにすることは、「ユーザー名列挙」の脆弱性として知られています。これはよくまとめられています here :
攻撃者として、ログインページまたはパスワードを忘れた場合のページを使用して、リストを10000のターゲットから1000のターゲットに絞り込むことができれば、私はそうします。
そのリストに「サインアップページ」を追加できます。これは、攻撃者がフィッシングキャンペーンやパスワード推測攻撃を仕掛けるのに役立ちます。 Bobの妻のアリスが[email protected]がAshley Madison.comに存在するかどうかを確認できる場合、これはプライバシーの問題でもあります。
基本的に、ユーザーがメールとは別の独自のユーザー名を選択できるようにする場合、ユーザーの列挙を防ぐには、メール/パスワードのみでのログインを許可し、サイト上の他のユーザーを識別する手段としてユーザー名を使用します。
このように、申し訳ありませんが、ユーザー名foobarが使用されているため、脆弱性はありません。別のを選択してください。
これは、メールアドレスとは異なり、これらのユーザー名は世界でグローバルに一意ではないためです。したがって、ユーザーのプライバシーが侵害されたと言ってもユーザーのプライバシーは侵害されません。さらに、ユーザー名を直接使用してログインできないため、ユーザー列挙の脆弱性は発生しません。
追加のボーナスとして、これにより、アカウントの回復とサインアップがより簡単になります(これは常にセキュリティに優れています)。つまり、「ユーザー名を忘れた」機能や「パスワードを忘れた」機能は必要ありません。メールアドレスを使用してログインするため、ユーザーは覚えていることになります。これは、ユーザーがまだ自分のアクセス権を持っていると想定してアクセスを回復するために必要な唯一のことです。メールアカウント。ただし、メールアドレスでのユーザーの列挙を禁止していることを確認してください- this answer を参照してください。
この回答の更新として、ユーザーがメールアドレスを変更する場合に備えて、ユーザー名としてメールを使用したくないとおっしゃっています。アーキテクチャで「ユーザー名」を主キーとして使用している場合、これが問題であると私が見る唯一の理由は、電子メールアドレス(ユーザー名の場合)を更新すると、リンクされたすべてのテーブルで更新します。独立したPKを使用するようにこれを再構築することは、ユーザー名を静的にするよりも、これに対する推奨されるソリューションです。 (あなたのこの理由に関する私の側の大きな仮定に注意してください。)
@SilverlightFoxと@MaxTheBackspaceから良い答えがあります。
もう1つはっきりさせておきたいのは、アプリケーションの任意の時点で、デフォルトでnotを使用して、ユーザーが(おそらく)グローバルな一意の識別子を電子メールアドレスのように列挙できるようにすることです。一度もありません。 IPアドレスの監視とレート制限、および幼児によるフィンガーペイントで作成されたクリンゴン語のキャプチャーには対応していません。
これは、サービスのセキュリティだけでなく、ユーザーのプライバシーにも関係します。
これは一般的に深刻な問題ではありませんを除き、ユーザー名はスパムを許可する電子メールアドレスまたはユーザーのフィッシング。 (または、メッセージングAPIを提供する場合、潜在的に。)
それは、基になるユーザー名を秘密にする必要があると思われる場合:新しいユーザーに表示名を選択させますが、基になるユーザー名を選択することを許可しないでください。代わりに、OAuthを提供するか、乱数またはWordを追加しますログイン時に使用する表示名に変更します。
それでも、メッセージングAPIを使用している場合、より明確な保護手段は、メッセージに発信元のユーザー名が明確にマークされていることを確認することです。
ユーザー名ではなく電子メールを使用してログインプロセスを実行することをお勧めします。ユーザー名を認証にしないことでユーザー名が必要な場合、攻撃者はユーザー名の可用性チェックを悪意のあるツールとして使用できなくなります。この時点でのユーザー名は、単なる虚栄心と一般に向けられたアイデンティティです。
私は知っています コメントで あなたは、ユーザーが自分の電子メールを変更できるようにしたいので、これをログインに使用したくないと述べました。これを実行して、メールアドレスの変更。あなたがいるまさにそのサイトは、これを同じ方法で行います。
だから今あなたは誰かがすでに電子メールアドレスで登録したかどうかを確認する問題があります。手始めに、誰かがsomeguy
よりも[email protected]
を推測することははるかに困難です。そして、攻撃者がサービスでsomeguy
を知っていて、特に攻撃したい場合、パスワードだけでなく、自分のパスワードとともにサインアップした電子メールを知る必要があります。
ただし、自動化された攻撃と永続的な手動攻撃は発生します。 50のユーザー名の組み合わせを試した人が情報を探しているのか、合法的に使用したい完璧なユーザー名を見つけようとしているのかを判断するのは非常に困難です。しかし、誰かが5つの異なるメールを使用してサインアップしようとしている場合、それは虐待のはるかに大きな赤い旗です。
したがって、認証をユーザー名経由の電子メールに切り替えることで、次のようになります。
没落は コメントのLukas によって言及されたような潜在的なプライバシー漏洩です。誰かが特定のユーザーがメンバーであるかどうかを知りたいと思っていて、彼らがサインアップする可能性のあるメールを知っている場合は、登録システムでそれをクロスチェックできます。
ユーザーインターフェースや使いやすさの観点から、すでに3つの手順(メール、電話、再キャプチャ)を実行している場合は、マシン攻撃の可能性が低くなり、それ以上の障害により、サインアップしたい人の数が減りますが、欲求不満にあきらめます。個人的にはMarkyMark
を選択してもかまいません(いいえ、私はラッパーではありません)。他のラッパーがその名前を使用している場合は、 MarkyMarkは既に使用されている(そして他の人が提案したように、3年前にすでに登録していたことを忘れた場合に備えて、MarkyMark
としてログインできるようにするオプションも提供します)、およびサイトがMarkyMark345
またはMarkyMarkyMark
を試してみることを提案した場合、必ずしもMarkyMark1
からMarkyMark344
がすでに使用されているとは限りません。私は提案に感謝します。実際、サイトがMarkyMark78
を提案して、私がMarkyMark77
を試してみるとwas成功しました。
ユーザー名とパスワードの組み合わせが攻撃者にアカウント/システムへのアクセス権を与えるため、ユーザー名を列挙することは脅威です。
どのくらいシステムに依存する脅威の=。たとえば、ユーザー名がとにかくすべての投稿に添付されているフォーラムでは、その脅威は非常に低いです。強力なパスワードを適用すると、脅威が軽減されます。
あなたのシナリオでは、彼がそのステップに到達する前にチェックしたすべてのデータのために、列挙は信じられないほどコストがかかるため、頭を悩ますのをやめて、マークスチュワートが提案する代替案を提示して、「ユーザー名を取得」と伝えてください。