11


6

PHP:フラッド対策/スパムシステム

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

  • 今日のWebサーバー(Apache、IIS)には、何らかの防御が組み込まれていますか ブルートフォースに対して?

  • アンチスパム/フラッドシステムを実装する最良の方法は何ですか たとえば、1ページを1分間に2回以上呼び出せないようにしますが、別のページは1分間に100回程度呼び出すことができます。

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

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

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

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

6 Answer


19


  • CAPTCHAについて:*本当に必要でない限り、CAPTCHAを使用しないことをお勧めします。 Why?

    1. それは醜いです。

    2. ユーザーにとって迷惑です。 飛び越えさせてはいけません あなたのサイトを使用するフープ。

非常に単純で、非常に効果的であり、_〜(ほとんどすべて)〜_ユーザーに対して完全に透過的である代替手段がいくつかあります。

  1. ハニーポットフィールド:次のような一般的な名前でフィールドをフォームに追加します 「ウェブサイト」。 その横に、「このボックスに書き込みをしない」という効果を示すラベルを追加します。 Javascriptを使用すると、入力とラベルが非表示になります。 フォームの送信を受け取ったときに、フィールドに何かがあれば、入力を拒否します。 + JSのユーザーには表示されず、問題ありません。 JSを持たないユーザーは、簡単な指示に従うだけです。 スポンボットはそれのために落ちて、彼ら自身を明らかにします。

  2. *自動偽のCAPTCHA *:これは上記と同様です。 入力を追加する "Write 'Alex' "(たとえば)というラベルの付いたフィールド。 Javascriptを使用して(そしてほとんどの自動化されたスパムボットがJSを実行しないことを知っている)、フィールドを非表示にして「Alex」を入力します。 送信されたフォームにマジックワードがない場合は、無視してください。 + JSのユーザーには表示されず、問題ありません。 JSを持たないユーザーは、簡単な指示に従うだけです。 Spambotsは何をすべきかわからないため、入力を無視できます。

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

'' '' '

*ブルートフォースブロッキングについて:*これを実行する唯一の実行可能な方法は、サーバー側のソリューションです。 私の現在のプロジェクトの1つに、あなたが説明したものに非常に似たブルートフォース保護システムを実装しました。 CakePHPのこのhttp://bakery.cakephp.org/articles/view/brute-force-protection[Brute Force Protectionプラグイン]に基づいています。

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

  1. ユーザーが何らかのアクションを要求します(パスワードのリセットなど)

  2. 実行: DELETE * FROM brute_force WHERE expires <NOW()

  3. Run:

    SELECT COUNT(*) FROM brute_force
    WHERE action = 'passwordReset'
    AND ip =
  4. カウントが「X」より大きい場合は、しばらく待つように伝えます。

  5. それ以外の場合は、実行します:

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

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


5


  1. はい、IPアドレス、最後にアクセスした時間、アクセスした時間を データベースは問題ありません。

  2. パスワードの登録/回復にCAPTCHAを使用することをお勧めします。 電子メールアドレスはスパムできません。 また、総当たり攻撃を停止します。

  3. はい、テキストCAPTCHAは可能ですが、誰かにとってははるかに簡単です 答えを自動化するスクリプトをクラックして記述します。 無料のCAPTCHAについては、http://recaptcha.net/ [Recaptcha]をお勧めします。

  4. それは本当にセキュリティをどれだけ気にするかにかかっています。 確かに 実装が簡単なので、CAPTCHAを使用することをお勧めします。


1


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

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

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

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

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

HTH

C.


0


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


-1


IPアドレスを保存することは、ログ記録と追跡の優れた実践ですが、キャプチャだけでスパム、ブルートフォース攻撃、フラッディングを防ぐことができると思います。

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


-1


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

テキストキャプチャは簡単にクラックされています

Anti-Spam / Floodシステムの場合、IPアドレス(MySQLが望ましい)をログに記録し、時間制限ログイン再試行を追加できます。