ブログを書いていて嫌なことがあります。それはスパムコメントへの対応です。 過去2年間、私のブログには1日あたり8,000件以上のスパムコメントが寄せられていました。 1日あたりです。 このゴミでデータベースを肥大化させると、あらゆる面でブログのスピードが落ちてしまうので、最近はもうやめにしました。 また、コメントのモデレートをしたり、メールボックスに大量のSPAMコメントの通知を見たりすることにも疲れました。
どのようにしてスパムを受けていたのか
判断する方法はありませんが、ボットは私がWordPressのブログを持っていることを検知し、コメントを送信するためのフォームキーを知っていて、それに従って行動していたと思われます。 バイアグラ、シアリス、マイケルコース、ナイキの靴などのコメントが寄せられていました。 ボットだけが時間を費やすような内容です。 これはすべて、検出された、自動化された攻撃である必要がありました。
うまくいかなかった点
すべてです。 さまざまなWordPressプラグインを使用していましたが、SPAMを受け続けていました。 Akismetは、WordPressのSPAM保護の第一人者ですが、問題を防ぐことができず、100KB以上のJavaScriptが含まれていたため、サイトの速度が低下しました。 私はCAPTCHAユーティリティーを使用しませんでした。なぜなら、私のサイトにコメントする際に障害となるものは、私が対処すべき問題であり、あなた方全員の問題ではないからです。 結局、数多くのユーティリティーに失望しました。 ガッカリしましたが、諦めることはありませんでした。
うまくいったこと
最初のステップは、すべてのスパム対策プラグインを削除することでした。なぜなら、これらのプラグインが互いに干渉してスパムを入れている可能性が高かったからです。 私の解決策は、一般的なスパム対策を可能にすることでした。つまり、送信プロセスの間、空のままであるべき入力をフォームに追加することでした。 値は空でもキーは存在する:前提として、フォーム入力を読むボットは、空の値に基づいて送信が拒否されないようにするために、フォームフィールドの値にゴミを入力することになります。
スパム対策の実装方法
サーバー側で入力項目を追加することはできません。入力項目はページに出力され、ボットはそれを読み取って入力する(または入力しない)ことができます。 これらのフィールドをクライアント側で作成することで、単純なボット/curlリーダーを排除することができます。 前述のフォームフィールドは、JavaScriptを使って(どんなフレームワークでも)追加することができ、それが最善の策です。 しかし、その前に、サーバー側でのSPAMブロックチェックを実装しましょう。
WordPressのPHP
サーバー側でコメントを受け付ける前に、ダイナミックキーの存在を確認する必要があります。 必要なのは isset チェックです。
1 2 3 4 5 6 7 8 9 10 |
// Fuck off spammers function preprocess_new_comment($commentdata) { if(!isset($_POST['is_legit'])) { die('You are bullshit'); } return $commentdata; } if(function_exists('add_action')) { add_action('preprocess_comment', 'preprocess_new_comment'); } |
このチェックが失敗した場合、コメントを拒否します。 もちろん、JavaScriptをサポートしていないユーザーはコメントを拒否されることになりますが、スパムに遭う可能性はJSをサポートしていないユーザーよりも高いでしょうから、私はそれで構いません。 キーが設定されていない場合は、コメントを完全に拒否します。 これはもちろんチャンスではありますが、統計的には価値があると思います。
JavaScript
ここでの簡単な答えは、基本的なJavaScriptを使ってフォームフィールドを挿入することです。すべてのJSフレームワークには独自の構文があるので、すべてのコードを提供することは控えます。 ページロード時にフィールドを追加することは、インテリジェントなボットがそれを検知できるかもしれないので、私には少し疑わしいように思えます。 私のブログの場合、MooToolsを使用し、AJAXでコメントを送信していますので、送信時にJavaScriptのコード内に秘密のフィールドを追加するだけです。
1 2 3 4 5 6 7 8 9 |
var form = $('comment-form'); new Request({ url: form.action, method: 'post', onRequest: function() {}, onSuccess: function(content) {}, onComplete: function() {} }).send(form.toQueryString() + '&is_legit=1'); |
投稿時にそのキーを追加することで、今のところ安全であることが証明されています。
SPAMコメントは0件!
2週間後、SPAMコメントは0件でした。 ゼロです。 全くありません。 1日に8,000件以上あったのがゼロになりました。 Akismetよりも、どんなプラグインよりも優れています。 WordPressのスパム対策を自分の手で行うことができます。小さなPHP関数でクライアントサイドの魔法を使い、生活を楽にすることができます。