[解決済み] ハニーポット実装の改善 (フォームスパム対策)
質問
どうしたらスパムボットを排除できるでしょうか?
どのサイトも スパムボット の被害を受けることがあります。それをどのように扱うかは顧客に影響を与え、ほとんどの解決策は、フォームに記入することを思いとどまらせることができます。
そこで登場するのがハニーポット技術です。これにより、ユーザーがフォームに記入するためにキャプチャや他の輪を飛び越えることを強いられることなく、スパムボットを無視することができるようになります。
この投稿は、純粋に他の人が自分のウェブサイトのフォームにハニーポットトラップを実装するのを助けるためのものです。
更新しました。
以下のハニーポットをクライアントの全ウェブサイトに実装して以来、私たちは以下のようなブロックに成功しました。 99.5% (数千の送信) のスパムをブロックすることに成功しました。これは、近日中に実装されるであろう、quot;advanced" セクションで言及されたテクニックを使用しない場合です。
どのように解決するのですか?
コンセプト
スパムボットにしか見えない不可視のフィールドをフォームに追加することで、実際のエンドユーザーではなくスパムボットであることを明らかにするよう仕向けることができます。
HTML
<input type="checkbox" name="contact_me_by_fax_only" value="1" style="display:none !important" tabindex="-1" autocomplete="off">
ここでは、シンプルなチェックボックスがあります。
- CSS で非表示にしています。
- 無名だが明らかに偽名である。
- デフォルト値として 0 が設定されています。
- オートコンプリートで埋められません。
- を経由して移動することはできません。 タブ キーで移動することはできません。(参照 tabindex )
サーバーサイド
サーバーサイドでは、値が存在し、0以外の値を持つかどうかを確認し、存在する場合はそれを適切に処理したいと思います。 これには、試行と送信されたすべてのフィールドをログに記録することが含まれます。
PHPでは、次のようになります。
$honeypot = FALSE;
if (!empty($_REQUEST['contact_me_by_fax_only']) && (bool) $_REQUEST['contact_me_by_fax_only'] == TRUE) {
$honeypot = TRUE;
log_spambot($_REQUEST);
# treat as spambot
} else {
# process as normal
}
フォールバック
ここで、ログが登場します。何らかの理由でユーザーの 1 人がスパムとしてマークされた場合、ログは失われた情報を回復するのに役立ちます。また、将来、ハニーポットを回避するためにボットが変更された場合、サイト上で実行されているボットを調査することができます。
報告
多くのサービスでは、API を介して、またはリストをアップロードすることによって、既知のスパムボットの IP を報告することができます。(例えば CloudFlare ) あなたが見つけたすべてのスパムボットとスパムIPを報告することによって、インターネットをより安全な場所にするためにご協力ください。
高度な
より高度なスパムボットを本当に取り締まる必要がある場合、追加でできることがいくつかあります。
- ハニーポット フィールドを、CSS ではなく JS で純粋に隠す。
- 実際には使用しない、現実的なフォーム入力名を使用する。(例えば "phone" や "website" など)
- ハニーポット アルゴリズムにフォーム検証を含める。(ほとんどのエンドユーザーは 1 つか 2 つのフィールドを間違えるだけですが、スパムボットは通常、ほとんどのフィールドを間違えます)。
- 既知のスパム IP を自動的にブロックする CloudFlare のようなサービスを使用する。
- フォームのタイムアウトを設定し、即時投稿を防ぐ。(ページがロードされてから 3 秒以内に送信されたフォームは、一般的にスパムです)
- どの IP からも 1 秒に 1 回以上投稿できないようにします。
- その他のアイデアについては、こちらをご覧ください。 フォームスパマーを捕らえるためのNuclearハニーポットの作り方
関連
-
[解決済み] Angular 2: formGroup は FormGroup のインスタンスを期待します。1つを渡してください。
-
[解決済み] 使用用途
-
[解決済み] Webフォームのフィールド/入力タグでブラウザのオートコンプリートを無効にするにはどうすればよいですか?
-
[解決済み] フォーム送信のようなJavaScriptのポストリクエスト
-
[解決済み] jQuery AJAX送信フォーム
-
[解決済み] ユーザーがEnterキーを押してフォームを送信できないようにする
-
[解決済み】Postman Chromeです。form-data、x-www-form-urlencoded、rawの違いは何ですか?
-
[解決済み】GETメソッドとPOSTメソッドはいつ使うべきですか?両者の違いは何ですか?
-
[解決済み】Chromeの開発ツールのネットワークタブに表示される「リクエストペイロード」と「フォームデータ」の違いとは?
-
[解決済み] アップロードされたファイルのMIMEタイプは、ブラウザによってどのように決定されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angular 2: formGroup は FormGroup のインスタンスを期待します。1つを渡してください。
-
[解決済み] 使用用途
-
[解決済み] フォーム型Webサイト認証の決定版【終了しました
-
[解決済み] 電子メールアドレスに使用できる文字は何ですか?
-
[解決済み] AngularJSでフォームの入力を条件付きで要求するにはどうすればよいですか?
-
[解決済み】HTML5の "required "属性をチェックボックスのグループに使用する?
-
[解決済み] AngularJSでフォームが無効なときに送信ボタンを無効にする
-
[解決済み] カピバラを使って、フォームのフィールドが正しくプリフィルドされているかどうかを確認するにはどうすればよいですか?
-
[解決済み] angular2 submit ボタンを押さずに Enter キーを押してフォームを送信する。
-
[解決済み] アップロードされたファイルのMIMEタイプは、ブラウザによってどのように決定されるのですか?