CAPTCHAについて:本当に必要な場合を除いて、CAPTCHAの使用はお勧めしません。なんで?
- それは醜いです。
- それはあなたのユーザーにとって迷惑です。あなたは彼らにあなたのサイトを使うためにフープを飛び越えさせてはいけません。
非常に単純で、非常に効果的であり、(ほとんどすべての)ユーザーに対して完全に透過的であるいくつかの選択肢があります。
ハニーポットフィールド:「website」のような一般名でフォームにフィールドを追加します。その横に、「このボックスに書いてはいけない」という趣旨のラベルを付けてください。Javascriptを使用して、入力とラベルを非表示にします。フォームの送信を受け取ったときに、フィールドに何かがある場合は、入力を拒否します。
JSを使用しているユーザーには表示されず、問題ありません。JSを持たないユーザーは、簡単な指示に従う必要があります。スパムロボットはそれに落ちて、自分自身を明らかにします。
自動フェイクキャプチャ:これは上記と同様です。「Write'Alex'」というラベルの付いた入力フィールドを追加します(たとえば)。Javascriptを使用して(そしてほとんどの自動スパムボットがJSを実行しないことを知って)、フィールドを非表示にして「Alex」を入力します。送信されたフォームに魔法の言葉がない場合は、無視してください。
JSを使用しているユーザーには表示されず、問題ありません。JSを持たないユーザーは、簡単な指示に従う必要があります。スパムロボットは何をすべきかわからないので、入力を無視することができます。
これにより、自動スパムボットの99.9%から保護されます。それが少しでもしないことは、標的型攻撃からあなたを守ることです。誰かがボットをカスタマイズしてハニーポットを回避したり、常に正しい値を入力したりする可能性があります。
ブルートフォースブロッキングについて:サーバー側のソリューションは、これを明らかに行うための唯一の実行可能な方法です。私の現在のプロジェクトの1つでは、あなたが説明しているものと非常によく似たブルートフォース保護システムを実装しました。これは、CakePHP用のこのブルートフォース保護プラグインに基づいていました。
アルゴリズムはかなり単純ですが、最初は少し混乱します。
- ユーザーが何らかのアクションを要求します(たとえば、パスワードのリセット)
- 走る:
DELETE * FROM brute_force WHERE expires < NOW()
走る:
SELECT COUNT(*) FROM brute_force
WHERE action = 'passwordReset'
AND ip = <their ip address>
- カウントがそれよりも大きい場合は
X、しばらく待つように伝えます。
それ以外の場合は、次を実行します。
INSERT INTO brute_force (ip, action, expires)
VALUES (<their ip address>, 'passwordReset', NOW() + Y minutes)
- パスワードリセット機能を続行します。
これにより、ユーザーはY分間にX回だけパスワードのリセットを試みることができます。必要に応じて、これらの値を微調整します。おそらく5分で3回リセットされますか?さらに、アクションごとに異なる値を設定できます。たとえば、PDFの生成など、10分で10に制限したい場合があります。