THE JOURNAL

Contact Form 7のスパム対策|漢字とひらがなで迷惑投稿を防いだ実例

公開日
Contact Form 7のスパム対策。封筒をフィルターで振り分けるイメージ

最近、怪しいリンクを開かせようとする迷惑メールが多いと感じませんか。お問い合わせフォームから届くと、「仕事の相談かもしれない」と思って文面を確認しますよね。そのたびに、返信すべき連絡なのか、リンクを開いて大丈夫なのかを見極めるのは手間がかかります。

そこで、運用しているContact Form 7のお問い合わせフォームに、本文に漢字とひらがながそれぞれ含まれるかを確かめる入力チェックを追加しました。導入後、このフォームではそれまで届いていたスパムが届かなくなりました。

ここでは、英語や中国語だけの投稿を弾く仕組みと、特定のフォームに絞って使えるPHPコードを紹介します。元の正規表現では、句点の「。」があるだけで漢字側の条件を通る場合もあったので、その修正版も用意しました。

目次

英語や中国語だけの迷惑投稿を弾く仕組み

チェックするのは、本文に漢字とひらがながそれぞれ1文字以上あるかです。英字だけの投稿にはこの2種類の文字がなく、漢字で書かれた中国語の投稿も、ひらがながなければエラーになります。日本語の文章に英単語や数字が混じっていても、両方の条件を満たせば通ります。

Contact Form 7の送信時に動くPHPの入力検証を使います。条件を満たさない場合は「お問い合わせ内容」の欄にエラーを表示し、送信を止めます。フォームIDと項目名の両方を指定するので、同じ項目名を使う別のフォームにはこのルールを適用しません。 Contact Form 7公式のカスタム検証

「。」だけで漢字側の判定を通る理由

元のコードは、漢字側に \p{Han}、ひらがな側に [ぁ-ゖ] を使っています。PCRE2 10.40以降では、\p{Han} は漢字と一緒に使われる一部の記号にも一致します。ローカルのPHPで比較すると、「おみつもりをおねがいします。」は、漢字がなくても句点で条件を満たしました。 PCRE2公式の文字種判定の仕様

修正版では漢字側を \p{Unified_Ideograph} に変えます。UnicodeのCJK統合漢字に絞るので、「。」や「、」を漢字として数えません。この条件では「々」や「〇」も数えません。以下の表はサンプルの正規表現を比較した結果で、冒頭の実運用の結果とは別です。 Unicodeの文字プロパティ仕様

お問い合わせ内容の作例元の判定修正版
制作費のお見積もりをお願いします。通過通過
Please open the link. [URL省略]エラーエラー
请点击链接。[URL省略]エラーエラー
請點擊連結。[URL省略]エラーエラー
おみつもりをおねがいします。通過エラー
見積希望エラーエラー
Please open the link. 漢あ通過通過
PHP 8.3.36・PCRE2 10.45で正規表現を比較した結果。通過は文字条件を満たしたことを示します。

特定のフォームにだけ適用するPHPコード

このサンプルは、数値のフォームIDが 22 で、項目名が your-message のテキストエリアだけを検証します。日本語で受け付けるフォームかを確認してから、次の手順で試してください。

  1. WordPress管理画面の「お問い合わせ」で対象フォームを編集します。編集画面のURLにある post= の後ろの数字で、コードの 22 を置き換えます。ショートコードのIDがハッシュ形式でも、ここで使うのは数値の投稿IDです。 Contact Form 7のフォームIDの仕様
  2. 「フォーム」タブで本文欄の項目名を確認します。[textarea* your-message] ならそのまま使えます。別の項目名なら、コードの 'your-message' を書き換えます。
  3. WordPressが動くサーバーのPHPでPCRE2のバージョンを確認します。この例はPCRE2 10.40以降が前提です。サーバーでCLIを使える場合は php -r 'echo PCRE_VERSION, PHP_EOL;' で確認できます。CLIとサイト側が同じPHPを使っているかも確認してください。 PHPのPCRE2同梱バージョン
  4. 検証環境で、下のコードを wp-content/mu-plugins/cf7-japanese-message.php として保存します。ディレクトリがなければ作成します。この場所のPHPは自動で読み込まれます。停止する場合はファイルをこのディレクトリから外します。 WordPress公式のMUプラグイン解説
<?php
/**
 * Plugin Name: Contact Form 7 お問い合わせ内容の文字チェック
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

add_filter( 'wpcf7_validate_textarea', 'yomowebb_cf7_validate_japanese_message', 20, 2 );
add_filter( 'wpcf7_validate_textarea*', 'yomowebb_cf7_validate_japanese_message', 20, 2 );

function yomowebb_cf7_validate_japanese_message( $result, $tag ) {
    $form = WPCF7_ContactForm::get_current();

    // 22 は対象フォームの数値ID、your-message は項目名です。
    if ( ! $form || 22 !== (int) $form->id() || 'your-message' !== $tag->name ) {
        return $result;
    }

    $value   = $_POST[ $tag->name ] ?? null;
    $message = is_string( $value ) ? wp_unslash( $value ) : '';

    $has_kanji    = 1 === preg_match( '/\p{Unified_Ideograph}/u', $message );
    $has_hiragana = 1 === preg_match( '/[ぁ-ゖ]/u', $message );

    if ( ! $has_kanji || ! $has_hiragana ) {
        $result->invalidate(
            $tag,
            'お問い合わせ内容には、漢字とひらがなをそれぞれ1文字以上含めてください。'
        );
    }

    return $result;
}

任意の [textarea] にもこのチェックを追加しているため、空欄では送れません。本来は空欄でも送れるようにしたい場合は、本文を必須にするかどうかを決めてから適用してください。 Contact Form 7のフォームタグ仕様

導入前に試しておきたい送信

英語だけ・中国語だけの作例が止まることに加えて、実際の利用者が入力しそうな文章で、問い合わせが届くことまで確認します。

  • 「制作費のお見積もりをお願いします。」で送信し、メールが届く。
  • 英語だけ、ひらがなを含まない中国語、空欄で、対象欄にエラーが表示される。
  • 別のフォームでは、今まで受け付けていた入力が引き続き送れる。

入力欄の近くには「漢字とひらがなをそれぞれ1文字以上含めてください(例:制作費のお見積もりをお願いします)」と添えると、送信前に条件が伝わります。英語や中国語でも正当な問い合わせを受け付ける窓口なら、この文字条件をかけると、その問い合わせまで弾きます。

よくある質問

不審なリンクが入っていれば、必ず止まりますか?

漢字とひらがなを含む本文は、リンクが入っていても文字チェックを通ります。届いたリンクが不審なら開かず、実在するサービスを名乗っている場合は、普段使っている公式サイトなどから確認してください。 IPAの日常における情報セキュリティ対策

多言語で問い合わせを受け付ける場合は?

言語を問わず受け付けたいフォームでは、文字条件を付けず、Contact Form 7が案内しているTurnstileやAkismetなどを検討できます。 Contact Form 7公式のスパム対策

関連記事 Contact Form 7に届く外国語スパムへの対策

編集者

四方田修治 Web制作・WordPress構築 / 生成AI活用・SNS自動化 / SEO・LLMO・広告運用

Webデザイン・WordPressの構築/カスタマイズを中心に、HTML・CSS・PHPを用いたWebサイト制作に対応しています。表示速度の改善、SEO・LLMO、広告運用に加え、生成AIの活用やSNS運用の自動化についてもご相談いただけます。

YomoWebb.Designでは、制作実績、WordPressの使い方、生成AIの活用方法やツール選びなどを紹介しています。Web制作・サイト運用に役立てられるよう、専門的な内容を分かりやすくお伝えします。

FROM READING TO ACTION

読んだ知識を、サイトの改善へ。

ホームページ制作、SEO・AI検索対策、ローカルSEO、表示速度の改善。自分のサイトにどう取り入れるか迷ったら、現在の状況やお困りごとをお聞かせください。

ご相談内容は、わかる範囲で大丈夫です。サイトのURLがあれば、あわせてお知らせください。

よかったらシェアしてね!
  • URLをコピーしました!