17

構築中の Web サイトでブルート フォース ログイン試行を防止するスクリプトを作成しようとしています。ロジックは次のようになります。

  1. ユーザーがログイン情報を送信します。
  2. ユーザー名とパスワードが正しいかどうかを確認します
    • はいの場合は、入れてください。
    • いいえの場合、失敗した試行をデータベースに記録します。特定の時間枠内に失敗が多すぎるかどうかを確認します (例: 5 分間で 5 回)。
      • Yes の場合、実行を 10 秒間一時停止しsleep(10)、ログインの失敗をユーザーに報告します。
      • ログインの失敗をすぐにユーザーに報告する

これを同僚に説明すると、ハッカーがたとえば 1 秒間に 1000 件のリクエストを送信した場合、これがどのように役立つかを尋ねられました。最初の 5 個はすぐに返され、残りの 995 個はすべて 10 秒しかかからないでしょうか?

HTTP がどのように機能するかを完全には理解していないのではないかと疑っています。そのような状況はあり得るのでしょうか、それともサーバーが 1 つのクライアントから処理する同時要求の数に制限はありますか?

より良い解決策は、睡眠時間を増やすことでしょうか?

sleep($numRequestsInLast5Minutes - 5)

したがって、最初の 5 つは高速で、その後はすべてスリープが長くなります。

4

5 に答える 5

15

問題は、ユーザーのアクセシビリティと攻撃者モデルのバランスです。

最初の解決策

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 ブロックできませんが、パスワードを覚えておく必要があります。
アタッカー: 効率的なブルート フォース攻撃が難しい。

重要な注意事項

ログインフォームまたはログイン送信リンクはブロックされていますか? ログインフォームをブロックしても意味がありません。

ブルート フォースへの耐性は、まずパスワードの複雑さの問題であるため、厳格なパスワード ポリシーが必要です (特に分散型ブルート フォースの場合)。

パスワードをソルトでハッシュするという事実については言及しませんが、すでにこれを正しく行っていますか? ブルートフォースよりもパスワードデータベースにアクセスする方が簡単な場合、攻撃者はこのソリューションを選択するためです ( 「チェーンは、その最も弱いリンクと同じくらい強力です」 )。

于 2013-04-04T11:52:18.307 に答える
13

ユーザーが試行に失敗した場合、たとえば 5 回以上 5 分以上試行した場合は、503 Service Unavailableその IP アドレスに対してすぐに を返し始めることをお勧めします。ログインが失敗した場合、memcache を使用して IP の現在の不正な試行を取得し、その量を増やして、5 分の有効期限で memcache に保存することができます。

sleep1 人のユーザーが Web サーバーへの多数の接続を作成できるようになり、他のユーザーをダウンさせる可能性があるため、PHP コードにを入れたくないでしょう。

ユーザーがログインしていないため、セッション Cookie はありません。ユーザーがアカウントにブルート フォースで侵入しようとしても、Cookie がまったく表示されない可能性があります。

于 2009-11-13T05:58:39.957 に答える
4

私はこのようなものを使用しました...

  1. ユーザー名とパスワードを確認する

    1.1 一致しない場合は、そのコンボで最後にログインに失敗した時間とログインに失敗した回数を記録します。

    1.2 失敗するたびに、failsCount * 30 秒、最大 (10 分など) のようにログインできるようになるまで待機します。

  • これは、ブルート フォース攻撃が指数関数的に長くかかることを意味します。
  • ユーザーをロックアウトする可能性がありますが、ロックアウト期間中にログインしようとしたときに失敗したログインはカウントされません。これで最小限に抑えられるはずです。

私はこれを開発しましたが、まだ公開していないので、フィードバックをいただければ幸いです。

于 2009-11-17T04:36:09.413 に答える
2

ベスト プラクティスが何であるかはわかりませんが、DoS 攻撃に対処する場合、より良い戦略は実際にトラフィックをサーバーから迂回させることです。まだリクエストを処理して PHP を実行しているため、タイムアウトを設定しても実際には役に立ちません。

ログインページの簡素化されたバージョンを実行する別の Web サーバーをセットアップすることを検討しましたか? ユーザーが何度も (たとえば、何千回も) 試行した場合は、メッセージを送信してルーターを構成し、このユーザーを 2 番目の Web サーバーにリダイレクトします。

これは、Web サイトがスラッシュドット効果に見舞われた場合、多くの Web サイトはトラフィックが減るまでトラフィックをリダイレクトするだけのようなものです。

于 2009-11-13T05:49:02.433 に答える