11

私は実際にユーザーシステム(ログイン、登録、紛失したパスワードを電子メールに送信など)を特徴とするPHPプロジェクトに取り組んでおり、これはブルートフォース攻撃やスパムに対して非常に脆弱である可能性があると思います(送信1000回などの誰かの電子メールへのパスワード。あなたのファンタジーを使用してください)。

  • 今日のWebサーバー(Apache、IIS)には、ブルートフォースに対する何らかの組み込みの防御機能がありますか?
  • たとえば、ページを1分間に2回以上呼び出せないようにしたいが、別のページを1分間に100回程度呼び出すことができる場合、スパム対策/洪水システムを実装するための最良の方法は何でしょうか。 。

    • 私は間違いなくIPアドレス、最後にページにアクセスした時刻、どこかにアクセスした回数を保存する必要がありますが、テキストファイル/データベース(MySQL)に保存するのに十分効率的です

    • 紛失したパスワードの登録/回復などにキャプチャを使用する必要がありますか?

    • 「テキスト」キャプチャは実行可能ですか?(「5プラス9マイナス2とは何ですか?」のようなもの)

    • このページはそれほど多くのユーザー(100〜200)によって使用されることはありませんが、実際にこれらすべてを実装する必要がありますか?

4

6 に答える 6

21

CAPTCHAについて:本当に必要な場合を除いて、CAPTCHAの使用はお勧めしません。なんで?

  1. それは醜いです。
  2. それはあなたのユーザーにとって迷惑です。あなたは彼らにあなたのサイトを使うためにフープを飛び越えさせてはいけません。

非常に単純で、非常に効果的であり、(ほとんどすべての)ユーザーに対して完全に透過的であるいくつかの選択肢があります。

  1. ハニーポットフィールド:「website」のような一般名でフォームにフィールドを追加します。その横に、「このボックスに書いてはいけない」という趣旨のラベルを付けてください。Javascriptを使用して、入力とラベルを非表示にします。フォームの送信を受け取ったときに、フィールドに何かがある場合は、入力を拒否します。

    JSを使用しているユーザーには表示されず、問題ありません。JSを持たないユーザーは、簡単な指示に従う必要があります。スパムロボットはそれに落ちて、自分自身を明らかにします。

  2. 自動フェイクキャプチャ:これは上記と同様です。「Write'Alex'」というラベルの付いた入力フィールドを追加します(たとえば)。Javascriptを使用して(そしてほとんどの自動スパムボットがJSを実行しないことを知って)、フィールドを非表示にして「Alex」を入力します。送信されたフォームに魔法の言葉がない場合は、無視してください。

    JSを使用しているユーザーには表示されず、問題ありません。JSを持たないユーザーは、簡単な指示に従う必要があります。スパムロボットは何をすべきかわからないので、入力を無視することができます。

これにより、自動スパムボットの99.9%から保護されます。それが少しでもしないことは、標的型攻撃からあなたを守ることです。誰かがボットをカスタマイズしてハニーポットを回避したり、常に正しい値を入力したりする可能性があります。


ブルートフォースブロッキングについて:サーバー側のソリューションは、これを明らかに行うための唯一の実行可能な方法です。私の現在のプロジェクトの1つでは、あなたが説明しているものと非常によく似たブルートフォース保護システムを実装しました。これは、CakePHP用のこのブルートフォース保護プラグインに基づいていました。

アルゴリズムはかなり単純ですが、最初は少し混乱します。

  1. ユーザーが何らかのアクションを要求します(たとえば、パスワードのリセット)
  2. 走る:DELETE * FROM brute_force WHERE expires < NOW()
  3. 走る:

    SELECT COUNT(*) FROM brute_force 
    WHERE action = 'passwordReset'
    AND ip = <their ip address>
    
  4. カウントがそれよりも大きい場合はX、しばらく待つように伝えます。
  5. それ以外の場合は、次を実行します。

    INSERT INTO brute_force (ip, action, expires)
    VALUES (<their ip address>, 'passwordReset', NOW() + Y minutes)
    
  6. パスワードリセット機能を続行します。

これにより、ユーザーはY分間にX回だけパスワードのリセットを試みることができます。必要に応じて、これらの値を微調整します。おそらく5分で3回リセットされますか?さらに、アクションごとに異なる値を設定できます。たとえば、PDFの生成など、10分で10に制限したい場合があります。

于 2010-01-29T15:29:40.727 に答える
5
  1. はい、データベースにIPアドレス、最後にアクセスした時間、アクセスした時間を保存することは問題ありません。
  2. 電子メールアドレスがスパムされないように、パスワードの登録/回復にCAPTCHAを使用することをお勧めします。また、ブルートフォースを停止します。
  3. はい、テキストCAPTCHAは可能ですが、誰かが答えを自動化するためのスクリプトを解読して作成するのははるかに簡単です。無料のCAPTCHAについては、Recaptchaをお勧めします。
  4. それは本当にあなたがセキュリティをどれだけ気にかけているかに依存します。CAPTCHAは実装が簡単なので、使用することをお勧めします。
于 2010-01-29T14:32:35.887 に答える
2

PHPにすべてのロジックを実装しようとしないでください。スタックの下位に実装できるほど、より効率的に処理できます。

ほとんどのファイアウォール(BSD / Linux上のiptablesを含む)には接続スロットリングがあります。また、DDOS/ブルートフォース攻撃防止のためのmod_securityもご覧ください。

この種の攻撃では攻撃者がアプリにアクセスできないという考えに基づいてアプリケーションを設計する必要があります。結局のところ、DOS攻撃を防ぐ方法はありませんが、その効果を制限することはできます。

攻撃者からの一貫したIPアドレスに依存することには、それほど価値はありません。それを回避する方法はたくさんあります。

たとえば、各ユーザーによるログイン間のパスワードリセット要求の数を追跡します。パスワードリセットフォームで、ユーザーが不明な電子メールアドレスを送信した場合とまったく同じ方法で(クライアントに)応答します。無効なメールアドレスをログに記録します。

HTH

C。

于 2010-01-29T17:07:24.217 に答える
0

Gazlerが言っていることを実行することに加えて、一般的なログイン試行をカウントする方法も必要です。すべてのログイン試行の合計がXよりも大きい場合は、sleepコマンドの使用を開始するか、サーバーの負荷が高いと言ってください。

于 2010-01-29T14:52:18.063 に答える
-1

IPアドレスを保存することは、ログインと追跡には良い習慣ですが、キャプチャだけでスパム、ブルートフォース攻撃、フラッディングを防ぐことができると思います。

Recaptchaは確かに良い解決策です。

于 2010-01-29T14:35:32.953 に答える
-1

確かに、あなたのターゲットオーディエンスは大きくないかもしれませんが、それがパブリックドメインにある場合、それは脆弱です、

テキストキャプチャは最近簡単にクラックされます私を信じて

スパム対策/洪水システムの場合、IPアドレス(できればMySQL)をログに記録し、ログインの再試行に制限時間を設けることができます。

于 2010-01-29T15:05:02.773 に答える