WEBサイトのスパム対策2

2025.12.11

前回の記事では、スパム対策として以下の3つを紹介しました。

  1. reCAPTCHA v3 または Cloudflare Turnstile
  2. ハニーポットの設置
  3. お問い合わせ内容に「日本語必須」バリデーションを追加する

今回は、WordPress + Contact Form 7 を使った実際の実装方法を詳しく解説します。

1. reCAPTCHA v3 または Cloudflare Turnstile の導入方法

1-1.Google reCAPTCHA 管理画面にアクセス

1-2.新規登録

  • タイプ:reCAPTCHA v3
  • ドメイン:あなたのサイトのドメイン

キー(サイトキー / シークレットキー)が発行されます。

1-3.Contact Form 7 にキーを設定

WordPress 管理画面
「お問い合わせ」→「インテグレーション」

▼ reCAPTCHA を選択してキーを貼り付ける。

2. Contact Form 7 にハニーポットを追加する方法

ハニーポットとは、「人間が入力できないフィールドを置き、入力されたらスパム判定」する手法です。

2-1.Contact Form 7にフィールドを追加

[text honeypot class:honeypot]

2-2.functions.phpへ下記を追加

add_filter( 'wpcf7_validate_text', 'my_honeypot_validation', 10, 2 );
add_filter( 'wpcf7_validate_text*', 'my_honeypot_validation', 10, 2 );
function my_honeypot_validation( $result, $tag ) {
    $name = $tag->name;

    if ( $name === 'honeypot' ) {
        $field_value = isset($_POST[$name]) ? trim($_POST[$name]) : '';

        if ( !empty($field_value) ) {
            // スパム扱い
            $result->invalidate( $tag, "エラー:不正な送信です。" );
        }
    }
    return $result;
}

2-3.CSSでハニーポットを見えない位置に移動

.p-contact .honeypot {
  position: absolute;
  left: -9999px;
}

これで、人間の目からは見えない位置にあるフィールドが入力されたらエラーを返すハニーポットが設置できました。

3.お問い合わせ内容に「日本語必須」バリデーションを追加する方法

お問い合わせ内容(textarea)が 日本語を含まない場合エラーにする方法です。

3-1.Contact Form 7にフィールドを追加

[textarea textarea class:textarea]

3-2.functions.phpへ下記を追加

add_filter( 'wpcf7_validate_textarea', 'check_textarea_contains_japanese', 20, 2 );
add_filter( 'wpcf7_validate_textarea*', 'check_textarea_contains_japanese', 20, 2 );
function check_textarea_contains_japanese( $result, $tag ) {
    // 対象フィールド名を限定(name="textarea" のみ)
    $target_name = 'textarea';
    $name = $tag->name;
    if ( $name !== $target_name ) {
        return $result; // 対象外はそのまま
    }
    // POST から値を取得(CF7 が既にサニタイズしているが念のため trim)
    $value = isset( $_POST[ $name ] ) ? trim( wp_unslash( $_POST[ $name ] ) ) : '';
    // 日本語(ひらがな・カタカナ・漢字)が1文字でも含まれているかをチェック
    if ( ! preg_match( '/[\p{Hiragana}\p{Katakana}\p{Han}]/u', $value ) ) {
        // エラーメッセージ
        $result->invalidate( $tag, '日本語でお願いします。' );
    }
    return $result;
}

これで、textareaに日本語が含まれていないとエラーとなるバリデーションを追加できました。

まとめ

reCaptcha、Turnstile、ハニーポットの設置や日本語必須バリデーションを組み合わせることで、スパムをほぼゼロにできます。

Contact

ツールに関するご質問、
WEBサイト制作のお問い合わせ