ブログを運営していると、避けて通れないのが「コメントスパム」の存在です。
最初は数件程度だったスパムも、記事数の増加に伴って指数関数的に増え、手動での削除が追いつかなくなることも珍しくありません。
私のブログでも、ある時期からコメント欄へのスパム投稿が目に見えて増えてきました。最初のうちは1日に2〜3件ほどで、承認前に削除すれば対処できていたのですが、記事が増えるにつれてスパムの数も加速度的に増えていきました。趣味のブログとはいえ、さすがに何らかの対策を講じざるを得なくなりました。
コメントスパム対策スクリプトを導入する
WordPressのコメントスパムに対してスクリプトで対策を行う場合、いくつかの有効なテクニックがあります。
本記事では、比較的簡単に実装できる4つのスパム対策テクニックを紹介し、それらを実際に組み込んだサンプルスクリプトもあわせてご紹介します。
なぜスパム対策が必要なのか?
コメント欄にあるスパムを放置すると、以下のような悪影響があります。
導入する4つのスパム対策テクニック
次の各テクニックは単独でも効果がありますが、組み合わせることで相乗効果を発揮し、より強固な防御壁を構築します。
- Honeypot(ハニーポット)を使ったテクニック
- タイムスタンプを使ったテクニック
- 禁止語リストを使ったテクニック
- User-Agent(ユーザーエージェント)を使ったテクニック
それでは、具体的なコードとそれぞれのテクニックについて説明します。
❶ Honeypot(ハニーポット)を使ったテクニック
最初に「honeypot(ハニーポット)」を使ったスパム対策をネットで知り、そのスクリプトをWordPressのfunctions.phpに記述して導入しました。すると、とても効果があり、スパムコメントの数が劇的に減少しました。
ハニーポットとは、文字通り「ハチミツの壺」のように、スパムボットをおびき寄せるための隠しフィールドです。
これは、ブログの訪問者には見えないようにCSSで非表示にされていますが、スパムボットはフォーム内のすべての入力欄に機械的に入力しようとする特性があります。
この特性を利用し、隠されたハニーポットフィールドに何らかの入力があった場合、それをスパムと判断するというテクニックです。
- 仕組み:
- コメントフォームにdisplay:none;などで完全に隠された入力フィールドを追加します。
- このフィールドにボットが何か入力して送信した場合、それは人間ではないと判断し、投稿をブロックします。
- 利点:
- 非常にシンプルでありながら、多くの単純なボットに対して効果的です。
- 訪問者は隠しフィールドが見えないため誤入力の心配がありません。
❷ タイムスタンプを使ったテクニック
それでも、ハニーポットをすり抜けてくるスパムは、わずかながら存在します。1件でもスパムを許してしまうと、そこから大量のスパムが送られてくる恐れがあります。
そこで、さらに別の対策として「タイムスタンプを使ったテクニック」を追加してみました。
これは非常に効果的で、私のブログではハニーポットとタイムスタンプの併用によって、ほとんどのスパムを防げるようになりました。
このテクニックは、ボットがフォームを人間には不可能な速度で入力・送信するという性質を利用します。
- 仕組み:
- フォームがページに表示された時刻(タイムスタンプ)を隠しフィールドに記録します。
- コメントがサーバーに受信された際に、そのタイムスタンプと現在の時刻を比較し、受信までの時間が極端に短い場合(例:5秒未満)はボットによるものと判断してブロックします。
- 利点:
- ハニーポットをすり抜けるような高度なボットでも、速度で検知できる場合があります。
- 注意点:
- 高速で入力するユーザー(例えば、短い文章を素早く入力したり、内容をコピー&ペーストしたりするケース)を誤ってブロックしてしまう可能性もゼロではありません。
- そのため、閾値(例:5秒)は、フォームの想定される入力速度に合わせて調整する必要があります。
- また、スパムボットの中には、意図的に送信速度を遅延させてくるタイプも存在します。そのようなボットの場合、フォームの表示からサーバーが受信するまでの時間がかかり、結果的に設定した閾値を超えてしまうため、この時間判定によるブロックを通過できる可能性もあります。
❸ 禁止語リストを使ったテクニック
これは、コメントスパムによく含まれる特定の単語やフレーズを検出し、ブロックするテクニックです。特に日本語のブログでは、高い効果が期待できます。
その理由は、コメントスパムの多くが英語で書かれているためです。読者からの正規のコメントが主に日本語で投稿される場合、英語の迷惑ワードをためらうことなく禁止語リストに追加できます。
これにより、日本語の正規コメントを誤ってブロックしてしまうリスクを抑えつつ、大量の英語スパムを効率よく排除することが可能になります。
- 仕組み:
- コメント本文に「viagra」「casino」「http://」など、スパムによく使われるキーワード(禁止語リストに登録された語句)が含まれていないかをチェックします。これらのキーワードが検出された場合、そのコメントの投稿はブロックされます。
- 利点:
- 特定の種類のスパム(医薬品、ギャンブル、リンク誘導など)に対して非常に効果的です。多くのスパムは決まったキーワードやフレーズを使い回すため、それらを的確に検出できるからです。
- 禁止語リストは、自分のサイトに合わせて自由に編集できます。スパムの傾向を分析し、それに応じて禁止語を追加・調整することで、スパム対策の効果をより高めることが可能です。
- 注意点:
- 誤検知のリスクが最も高いテクニックです。ブログの内容によっては、正規のコメントに含まれる単語が禁止語と判断されてしまう可能性があります(例、ITブログで「crypto」を禁止すると、暗号通貨に関する真面目なコメントもブロックされる可能性があります)。
- 禁止語は慎重に選び、定期的に見直すことが重要です。
❹ User-Agent(ユーザーエージェント)を使ったテクニック
User-Agentとは、ブラウザやアプリケーションがWebサーバーにアクセスする際に送信する「自分が何であるか」を示す情報です。この情報を利用してアクセスをチェックするテクニックです。
- 仕組み:
- コメントを投稿するリクエストのUser-Agent情報をチェックし、それが空である、あるいは「bot」などのボットを示すキーワードが含まれている場合に投稿をブロックします。
- 利点:
- 訪問者が使用する一般的なブラウザ(Chrome, Firefoxなど)とは異なる、機械的なUser-Agentを持つボットを効率的に排除できます。
- 注意点:
- 悪質なボットはUser-Agentを偽装することも可能です。また、一部の正規のクローラー(検索エンジンのボット)も「bot」という文字列を含みますが、それらは通常コメント投稿はしないため、WordPressのコメント処理スクリプトでは問題になることはないです。
コメントスパム対策スクリプト(functions.phpに追加)
ここまでに紹介した4つのスパム対策テクニックを組み合わせることで、ほとんどのスパムを強力にブロックできるようになります。
次にご紹介するのは、これらのテクニックを実装したスクリプトです。
WordPressのテーマ内にあるfunctions.phpファイルに追加することで動作します。
以下のスクリプトを、お使いのWordPressテーマの子テーマのfunctions.phpファイルにコピー&ペーストしてください。
/*
* コメントスパム対策スクリプト
* 最終更新日: 202○年◯月◯日
*
* このコードはWordPressの標準コメントフォームのスパム対策を強化するために
* 子テーマのfunctions.phpに追加して使用します。
*/
// [1] Honeypotフィールドとタイムスタンプフィールドをコメントフォームに追加
function my_advanced_spam_form_fields( $fields ) {
// 1. Honeypotフィールドの追加
$fields['honeypot_field'] = '<p class="comment-form-honeypot" style="position:absolute; left:-9999px; opacity:0; visibility:hidden;">' .
'<label for="honeypot">このフィールドは空のままにしてください:</label>' .
'<input id="honeypot" name="honeypot" type="text" value="" autocomplete="off">' .
'</p>';
// 2. タイムスタンプフィールドの追加
$fields['comment_timestamp'] = '<input type="hidden" name="comment_timestamp" value="' . time() . '">';
return $fields;
}
add_filter( 'comment_form_default_fields', 'my_advanced_spam_form_fields' );
// [2] Honeypot・投稿時間・禁止語のチェックを実行
function my_advanced_comment_spam_check( $commentdata ) {
// 2-1. Honeypotフィールドのチェック
if ( isset( $_POST['honeypot'] ) && ! empty( $_POST['honeypot'] ) ) {
// error_log('[SPAM_CHECK] Honeypot detected. IP: ' . $_SERVER['REMOTE_ADDR']); // 必要に応じてコメント解除
wp_die( '送信に失敗しました。再度お試しください。' );
}
// 2-2. 投稿時間チェック
if ( isset( $_POST['comment_timestamp'] ) ) {
$elapsed_time = time() - intval( $_POST['comment_timestamp'] );
// 5秒未満で送信されたコメントはボットの可能性が高い
if ( $elapsed_time < 5 ) { // 必要に応じてこの閾値を調整してください。
// error_log('[SPAM_CHECK] Too-fast comment (' . $elapsed_time . 's). IP: ' . $_SERVER['REMOTE_ADDR']); // 必要に応じてコメント解除
wp_die( '送信が早すぎます。もう少し時間をおいてお試しください。' );
}
}
// 2-3. 禁止語チェック
// 大文字・小文字を区別せず、コメント本文に特定の単語が含まれていないかチェックします。
// 必要に応じて禁止語リストを調整してください。
$badwords = [
// 'http://', // 真面目な投稿で使われる可能性あり。運用方針に応じて調整
// 'https://', // 同上
'viagra',
'cialis',
'sex',
'gambling',
'crypto',
'loan',
'casino',
'online pharmacy',
'whatsapp',
'telegram',
'get rich',
'earn money',
'credit card',
'buy now',
'discount',
'sale',
'bit.ly', // 短縮URLサービス
'.ru', // ロシアドメインなど、スパムに多用されるドメイン⇓
// '.xyz',
'.tk',
'.ml',
'.ga',
'.cf',
'.gq'
];
foreach ( $badwords as $word ) {
if ( stripos( $commentdata['comment_content'], $word ) !== false ) {
// error_log('[SPAM_CHECK] Forbidden word detected: "' . $word . '". IP: ' . $_SERVER['REMOTE_ADDR']); // 必要に応じてコメント解除
wp_die( '不適切なコンテンツが含まれています。投稿はブロックされました。' );
}
}
return $commentdata; // スパムでなければコメントデータをそのまま返す
}
add_filter( 'preprocess_comment', 'my_advanced_comment_spam_check', 10 ); // 優先順位を標準(10)で設定
// [3] User-Agentが空または「bot」を含む場合に投稿をブロック
function my_block_bot_user_agents() {
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
if ( empty( $ua ) || stripos( $ua, 'bot' ) !== false ) {
// error_log('[SPAM_CHECK] Blocked suspicious User-Agent. UA: ' . $ua . ' | IP: ' . $_SERVER['REMOTE_ADDR']); // 必要に応じてコメント解除
wp_die( 'User-Agentが不正なため、送信はブロックされました。' );
}
}
add_action( 'pre_comment_on_post', 'my_block_bot_user_agents' );
- WordPressの管理画面で「外観」→「テーマファイルエディター」と進み、子テーマ内の「functions.php」ファイルを選択します。
- そのファイルの最後の行にスクリプトを貼り付けます。
- 「ファイルを更新」をクリックします。

まとめ
4つのスパム対策テクニックを組み合わせた結果、私の環境ではほとんどのスパムに対応できており、今のところスパムを完全に遮断できています。
今回ご紹介したこれらの手法を組み合わせることで、単一の対策では防ぎきれなかったスパムも、多角的に検知・ブロックできるようになります。
スパムは日々進化しているため、完全に排除するのは難しいかもしれません。
しかし、このような多層的なアプローチは、あなたのブログをスパムから守る強力な手段になるはずです。
ぜひご自身のブログにも導入し、その効果を実感してみてください。
そして、もしこの対策をすり抜けるスパムが見つかった場合には、禁止語リストを見直すなどして、柔軟に対応していくことが大切です。
スパム対策として「最強」とも言われていたGoogleのreCAPTCHAも、今年末からは有料化されます。
無料で使えるのは月に10,000件までですが、執拗なスパム発信者に狙われれば、この上限はあっという間に超えてしまう恐れがあります。
それに比べて、honeypotやタイムスタンプといった軽量なスパム対策を組み合わせる方法なら、無料でありながら高い効果が期待できます。
コストをかけずにスパム防止ができる…そう考えると、こうしたテクニックはとてもお得な選択肢ではないでしょうか。
おわりに
私自身、functions.phpなどのテーマファイルを直接編集することには抵抗がありました。
ブログを始めた頃は、テーマに機能がまだ十分ではなく、PHPファイルに直接機能を追加するカスタマイズが盛んに行われていました。
そのため、さまざまなサイトからスクリプトをコピー&ペーストしていくうちに、ファイルの内容が複雑になり、何がどの機能なのか分からなくなることも少なくありませんでした。
特にテーマを変更する際には、どの記述が必要で、どれが不要なのかを判断するのが非常に難しかったです。
現在では、多くのWordPressテーマが高機能で完成度が高くなっており、信頼できるプラグインも豊富に存在するため、ほとんどの場合は特別なカスタマイズなしで快適に運用できます。
そのため、functions.phpを直接編集する必要性はだいぶ薄れていると言えます。
しかし、AIの登場によって、私の状況は大きく変わりました。
AIを活用することで、既存のスクリプトのチェックが簡単にできるようになりました。
これまでパッチワークのように複雑になっていたファイルの中身も、AIに精査してもらうことで不要な部分を削除したり修正したりするのが容易になったのです。
AIのサポートのおかげで、PHPファイルへのスクリプト追加やカスタマイズも、以前ほど不安なく行えるようになりました。
今回のスクリプトも、AIにチェックとエラー処理の編集を依頼したおかげで公開することができました。
もしAIのチェックがなければ、functions.phpに載せるスクリプトを公開するのは不安で避けていたでしょう。
AIによるチェックのおかげで、今まで個人的にしか使っていなかったマイナーなスクリプトを公開できるようになったのは、本当にありがたいことです。
コメント