問題は、ユーザーのアクセシビリティと攻撃者モデルのバランスです。
最初の解決策
If not password correct for a certain number of time:
block the user
send a reset link to the user
ユーザー: ブロックされる可能性があり、リセットを好まない
攻撃者: すべてのユーザーに対して認証を試みることで、すべてのユーザーをブロックしました (特に、すべてのログインが公開されている場合)。
2 番目の解決策
If not password correct:
sleep(amount_of_time)
問題は、「amount_of_time」の値は何ですか?
ユーザー: エラーごとに 'amount_of_time' を待つのが煩わしい場合があります
攻撃者: 試行を続けます。
3 番目のソリューション
If not password correct:
sleep(amount_of_time)
amount_of_time = amount_of_time * 2
ユーザー:パスワードの間違いが少ないため煩わしさを
軽減
4番目の解決策
If not password correct for a certain number of time:
submit a CAPTCHA
ユーザー: CAPTCHA を解決する必要があります (あまり複雑ではありません)
攻撃者: CAPTCHA を解決する必要があります (複雑でなければなりません)
優れたソリューション (そして多くのサイトで使用されています) ですが、CAPTCHA には注意してください。実装。とにかく、トリックがあります (次の解決策を参照してください)。
5番目の解決策
If not password correct for a certain number of time:
block the IP
(eventually) send a reset link
ユーザー: パスワードを正しく思い出せないため、ユーザーがブロックされる可能性があります。
攻撃者: ブロックはユーザーごとのログイン数に基づいているため、別のユーザーで同じパスワードを試行します。
最終的解決 ?
If several login attempts failed whatever is the user by an IP :
print a CAPTCHA for this IP
ユーザー: ユーザーは IP ブロックできませんが、パスワードを覚えておく必要があります。
アタッカー: 効率的なブルート フォース攻撃が難しい。
重要な注意事項
ログインフォームまたはログイン送信リンクはブロックされていますか? ログインフォームをブロックしても意味がありません。
ブルート フォースへの耐性は、まずパスワードの複雑さの問題であるため、厳格なパスワード ポリシーが必要です (特に分散型ブルート フォースの場合)。
パスワードをソルトでハッシュするという事実については言及しませんが、すでにこれを正しく行っていますか? ブルートフォースよりもパスワードデータベースにアクセスする方が簡単な場合、攻撃者はこのソリューションを選択するためです ( 「チェーンは、その最も弱いリンクと同じくらい強力です」 )。