INDEX目次を開く +

※本記事には広告(PR)が含まれます。

WordPressのお問い合わせフォームを公開していると、英語の営業文や不審なURLを含むスパムが急に増えることがあります。Contact Form 7に届く迷惑メールは、1つの対策だけですべて止めようとせず、フォーム側のスパム判定から順番に対処するのが基本です。

筆者はWeb制作の仕事で、お問い合わせフォームへの海外スパムに困っているクライアントサイトへアクセス制限を設定することがあります。その際に大切なのは、管理画面で設定をONにしただけで「ブロックできました」と報告しないことです。

海外IPを制限したなら、実際に海外IPへ切り替えて対象ページへアクセスし、国内回線では正常に利用できることまで確認します。この記事では、Contact Form 7で先に行いたい対策と、海外IP制限が必要なケース、VPNを使った確認方法を順番に解説します。

結論:まずフォーム側で対策し、海外IP制限は必要なサイトだけ行う

最初に、対策の順番をまとめます。

  1. WordPressとContact Form 7を更新する
  2. Cloudflare Turnstileを設定する
  3. 日本国内向けフォームなら、本文に日本語を含める入力チェックを追加する
  4. 必要に応じてAkismetや禁止用語リストを組み合わせる
  5. サーバーのWAFとアクセスログを確認する
  6. 国内向けサイトに限り、フォームページの海外IP制限を検討する
  7. 制限後は海外IPと国内回線の両方から動作確認する

「英語のメールが届いたから、海外からのアクセスをすべて拒否する」とすぐに決めるのはおすすめしません。国内IPやプロキシを経由するスパムには効かず、海外在住者や出張中の担当者など、正当な利用者まで止める可能性があるためです。

まずはContact Form 7が公式に対応しているスパム対策から始めます。

Contact Form 7に海外スパムが届く理由

公開されているお問い合わせフォームは、人だけでなく自動送信するボットからもアクセスできます。WordPressやContact Form 7だけが特別に危険という意味ではなく、インターネット上で誰でも送信できるフォームである以上、一定のスパムは届きます。

また、本文が英語であることや、海外サービスのURLが書かれていることだけでは、送信元が海外IPとは断定できません。

  • 海外のIPアドレスから直接送信されている
  • 国内外のサーバーやプロキシを経由している
  • 同じ文面を多数のフォームへ機械的に送っている
  • 人が営業目的で送信している

このように発生経路が異なるため、CAPTCHA、スパム判定、禁止用語、IP制限を組み合わせて考えます。

対策前に確認しておくこと

スパムとメール不達を切り分ける

「お問い合わせが届かない」という問題と、「迷惑メールが多い」という問題は別です。

Contact Form 7では、スパムと判定された場合にも、通常のメール送信失敗と同じようなエラーメッセージが表示されることがあります。対策後に正常な問い合わせまで届かなくなっていないか、送信側の画面と受信側のメールを両方確認します。

発生状況を記録する

設定を変える前に、次を記録しておくと効果を比較しやすくなります。

  • いつから増えたか
  • 1日に何件ほど届くか
  • 対象になっているフォーム
  • 繰り返される単語、URL、メールアドレスの傾向
  • 送信元IPを記録している場合は、その傾向

クライアントから転送されたメールや管理画面を記事・報告書に使う場合は、氏名、メールアドレス、IPアドレス、ドメイン、本文などを公開しないようにします。

WordPressとプラグインを更新する

WordPress本体、Contact Form 7、テーマ、関連プラグインをサポート中のバージョンへ更新します。古い環境のまま対策プラグインだけを追加すると、不具合の原因を切り分けにくくなります。

本番環境でいきなり更新せず、バックアップと検証環境を用意してから進めてください。

最優先はCloudflare Turnstile

現在のContact Form 7は、Cloudflare Turnstileとの連携機能を標準で備えています。TurnstileはCAPTCHAの代替としてボットによる送信を判定する仕組みです。

Contact Form 7公式も、特別にreCAPTCHAを使い続ける理由がなければTurnstileを選ぶよう案内しています。Cloudflare Turnstile連携の公式手順では、次の流れが説明されています。

  1. Cloudflare側でTurnstileウィジェットを作成する
  2. ウィジェットモードはManagedを選ぶ
  3. サイトキーとシークレットキーを取得する
  4. WordPress管理画面の「お問い合わせ」→「インテグレーション」を開く
  5. Turnstileの「インテグレーションのセットアップ」にキーを入力する

フォームへウィジェットを手動で埋め込む必要はありません。Contact Form 7が各フォームへ自動的に配置します。表示位置を変更するときだけ、フォームテンプレートへ[turnstile]タグを追加します。

今回は、入力内容を確認してからTurnstile、送信ボタンへ進めるよう、フォームテンプレートの末尾を次の順番にしました。

<div class="form-turnstile">[turnstile]</div>
<div class="form-button-wrapper">
  [submit "送信する"]
</div>

Contact Form 7の送信ボタン直前にCloudflare Turnstileを配置した画面

画像はローカル検証環境でCloudflare公式のテスト用キーを使った状態です。「テスト専用です」という表示は本番用キーへ切り替えると表示されません。

サイトキーとシークレットキーは役割が異なります。特にシークレットキーは、管理画面のスクリーンショットやソースコードで公開しないでください。

Akismetを組み合わせる

Akismetは、送信内容や送信環境を使ってスパムかどうかを判定します。Contact Form 7公式は、異なる種類のスパム対策を複数組み合わせることを推奨しています。

Contact Form 7でAkismetを使う場合は、フォームタグへ次のオプションを設定します。

[text* your-name akismet:author]
[email* your-email akismet:author_email]
[text your-url akismet:author_url]

名前だけでなく、メールアドレスやURLにも対応するオプションを付けることで、判定材料を増やせます。設定方法とテスト用の値はContact Form 7公式のAkismet連携手順で確認できます。

なお、個人ブログと企業・商用サイトではAkismetの利用条件が異なります。クライアントサイトで利用する場合は、現在のライセンスと料金を確認してください。

同じ文面には禁止用語リストを使う

同じ単語、ドメイン、IPアドレスを含むスパムが繰り返される場合は、WordPressの禁止用語リストも使えます。

WordPress管理画面の「設定」→「ディスカッション」にある「コメント内で許可されないキーワード」へ、対象を1行ずつ入力します。Contact Form 7もこのリストを参照し、一致する内容をスパムとして扱います。

送信元IPを受信メールへ含める場合は、Contact Form 7のメール設定で[_remote_ip]を利用できます。詳しい仕様はContact Form 7公式の禁止用語リスト解説を確認してください。

ただし、短い一般語や幅広い文字列を登録すると、正常な問い合わせまで止めるおそれがあります。最初から大量の語句を入れず、繰り返し届く明確なパターンに絞ります。

日本語を含まない本文をContact Form 7で拒否する

日本国内向けのサービスなのに、英語だけの営業文やURLだけを入力したスパムが繰り返し届く場合は、お問い合わせ本文に日本語を1文字以上含める入力チェックも有効です。

ここで「英語を禁止する」という条件にすると、製品名、会社名、URL、エラーメッセージなどを含む正常な問い合わせまで拒否しやすくなります。そのため、英数字の使用は許可したまま、ひらがな・カタカナ・漢字のいずれかが本文に含まれているかをサーバー側で確認します。

フォームの本文フィールド名がyour-messageの場合は、次のコードを子テーマのfunctions.phpまたはサイト専用の機能プラグインへ追加します。

function usagicode_validate_japanese_message( $result, $tag ) {
	if ( 'your-message' !== $tag->name ) {
		return $result;
	}
 
	$value = isset( $_POST['your-message'] )
		? trim( wp_unslash( $_POST['your-message'] ) )
		: '';
 
	if ( '' !== $value && ! preg_match( '/[\p{Hiragana}\p{Katakana}\p{Han}]/u', $value ) ) {
		$result->invalidate(
			$tag,
			'お問い合わせ内容に日本語を含めて入力してください。'
		);
	}
 
	return $result;
}
add_filter( 'wpcf7_validate_textarea', 'usagicode_validate_japanese_message', 20, 2 );
add_filter( 'wpcf7_validate_textarea*', 'usagicode_validate_japanese_message', 20, 2 );

この方法は、ブラウザ上のJavaScriptだけに頼らず、Contact Form 7の検証処理で判定します。フォームで別のフィールド名を使っている場合は、コード内のyour-messageを実際の名前へ合わせてください。

設定後は、次の4パターンを確認します。

  • 日本語だけの本文は送信できる
  • 日本語と英語・URLが混在する本文も送信できる
  • 英語だけの本文はエラーになる
  • 必須項目やメール送信など、もともとの機能に影響がない

英語だけのお問い合わせ本文をContact Form 7で拒否した画面

英語だけの本文を入力して送信すると、メールを送る前に「お問い合わせ内容に日本語を含めて入力してください。」と表示されます。日本語を含む通常の問い合わせや、日本語とURL・製品名が混在する本文は拒否しません。

この対策は、日本語での問い合わせだけを受け付けるサイトに向いています。外国人利用者、多言語サイト、海外取引の可能性がある場合は、正当な問い合わせを失うため採用しません。また、親テーマのfunctions.phpへ直接追加するとテーマ更新で消えることがあるため、本番では子テーマか機能プラグインで管理します。

サーバーのWAFも確認する

WAFは、Webサイトへの通信に攻撃で使われやすい文字列や特徴が含まれていないか判定する機能です。WordPressの管理画面やフォームを含むWebサイト全体の防御として有効ですが、営業メールや自然な文章に見えるスパムをすべて止める機能ではありません。

エックスサーバーを利用している場合は、WAF設定の各項目と注意点を確認してください。

WAFを有効にしたあと、フォームの送信内容によっては正常な送信も拒否される可能性があります。設定変更後は、短い文章だけでなく、URLや制作相談で使われそうな文字列を含むテストも行います。

海外IP制限を検討してよいケース

フォーム側の対策を行っても運用負担が大きく、次の条件に当てはまる場合は、海外IP制限を追加で検討できます。

  • サービスの対象が日本国内に限られている
  • 海外の顧客や拠点から問い合わせを受け付けない
  • 海外出張中の担当者が管理・確認する予定がない
  • 制限対象をフォームページだけに絞れる
  • 制限後に海外IPと国内回線の両方から確認できる

反対に、多言語サイト、訪日客向けサービス、越境EC、海外採用、海外拠点がある企業では、国単位の制限が機会損失につながります。

XServerの国外アクセス制限との違い

エックスサーバーの「WordPressセキュリティ設定」にある国外アクセス制限は、主にWordPressの管理画面、XML-RPC、REST APIなどへの国外アクセスを制限する機能です。

通常公開されているお問い合わせページ全体を、国別に拒否する機能と同じではありません。設定項目と対象はエックスサーバーのWordPressセキュリティ設定で解説しています。

管理画面が拒否されたことだけを確認して、「公開フォームも海外から送信できない」と判断しないようにします。

プラグインによる国別ブロック

WordPressのセキュリティプラグインには、国別にサイト全体または特定ページへのアクセスを制限できるものがあります。

たとえばAll In One WP SecurityのCountry Blockingでは、対象ページ、許可するIP、ブロック後の転送先などを設定できます。ただし、Country BlockingはPremium機能です。無料版の標準機能として紹介されている古い記事や、別機能との混同に注意してください。

国別判定は利用するIPデータベースや通信経路の影響を受けます。導入後は、設定画面の表示だけで完了とせず、実際に対象地域から確認します。

海外IPブロックが効いているかVPNで確認する

ここが、制作会社として特に大切な工程です。

クライアントへ「海外IPをブロックしました」と報告するなら、少なくとも海外IPから拒否され、国内回線では通常どおり利用できることを確認します。筆者はこの確認にESET VPNを使っています。

1. 国内回線で変更前の状態を確認する

VPNを切断した状態で、対象フォームを開いてテスト送信します。

  • ページが表示される
  • 必須項目の検証が動く
  • 送信完了メッセージが出る
  • 受信先へメールが届く

この基準がないと、制限設定ではなく、もともとのフォーム不具合を「ブロックできた」と誤認する可能性があります。

2. 海外の接続先へ切り替える

ESET VPNで米国などの接続先を選び、接続後にIP確認サービスで接続地域が変わったことを確認します。

ESET VPNの接続方法、接続先の変更、切断方法はESET VPNの使い方と海外IP検証で実画面を使って説明しています。

3. 対象ページの拒否を確認する

海外IPへ切り替えた状態で、対象のお問い合わせページへアクセスします。

  • ページ自体が拒否されるか
  • ページは表示されるが送信だけ拒否されるか
  • 別の公開ページは通常どおり表示されるか
  • WordPress管理画面だけが拒否されていないか

期待する結果は、採用した制限方法によって異なります。特定のフォームページを国別ブロックしたなら、そのページが拒否されることを確認します。XServerのWordPress国外アクセス制限なら、公開フォームではなく管理画面などの対象箇所を確認します。

4. 国内回線へ戻して再確認する

VPNを切断し、国内回線へ戻してからもう一度フォームを表示・送信します。海外IPを拒否できても、国内の正当な利用者まで使えなくなっていれば完了とは言えません。

結果が安定しない場合は、ブラウザのシークレットウィンドウ、キャッシュ、CDN、接続先IPの判定を確認します。

5. 設定内容と結果を記録する

クライアントへの報告には、機密情報を除いて次を残します。

記録項目内容
確認日時設定変更とテストを行った日時
対象サイト全体、フォームページ、管理画面など
国内回線表示・送信できたか
海外IP接続した国と、拒否された箇所
例外海外拠点、固定IP、外部サービスなど
復旧方法問題が起きた場合に戻す設定

スクリーンショットを残す場合も、IPアドレス、ドメイン、メールアドレス、顧客名、フォーム内容は黒塗りにします。

海外IPから確認するためにESET VPNを使う場合

国内向けのESET HOME セキュリティでは、PremiumとUltimateでESET VPNを利用できます。EssentialにはVPNが含まれません。

筆者はUltimateを使い、米国Atlantaへ接続してWordPressの国外アクセス制限を確認しました。VPN切断中には表示されなかったXServerの拒否画面が、海外IPへ切り替えたあとに表示されるところまで確認しています。

ESET VPNで米国Atlantaへ接続し、XServerのWordPress国外アクセス制限で拒否された画面

この画面は、エックスサーバーの国外アクセス制限によってWordPress管理画面へのアクセスが拒否された結果です。公開されているContact Form 7のフォーム全体が拒否された画面ではありません。フォームページへ別途国別ブロックを設定した場合は、そのフォームURLを海外IPから開き、採用した制限方法に応じた拒否画面やHTTPステータスまで記録します。

VPNだけを利用したい場合は単体VPNの方が合う可能性があります。一方、MacやWindowsのセキュリティ対策と、Web制作時の海外IP検証を1つの契約にまとめたい場合はESETが候補になります。

プランごとのVPN台数と価格はESET HOME セキュリティの3プラン比較にまとめています。初めて購入する方は、ESETの新規購入ページで現在の対象製品と販売条件を確認してください

海外IP制限をしてもスパムが止まらない場合

海外IPを拒否してもスパムが届く場合は、設定ミスとは限りません。

  • 国内IPやプロキシを経由している
  • 制限対象が管理画面だけで、公開フォームは対象外になっている
  • CDNやリバースプロキシのIPを参照している
  • メールアドレスが別の場所でも公開されている
  • フォーム以外の経路からメールが送られている

アクセスログとメールヘッダーを確認し、どの経路から届いたのかを切り分けます。国別ブロックだけを強化するのではなく、Turnstile、Akismet、禁止用語リストの判定も見直してください。

Contact Form 7のスパム対策でよくある質問

reCAPTCHAとTurnstileはどちらがよい?

Contact Form 7公式は、特別にreCAPTCHAを使う理由がなければCloudflare Turnstileを選ぶよう案内しています。既存サイトですでにreCAPTCHAを運用している場合は、すぐに切り替えるのではなく、現在の契約、Google Cloud設定、プライバシーポリシーへの記載を確認して判断します。

Akismetだけでスパムを完全に止められる?

自動判定に100%はありません。Akismetだけに任せず、Turnstileや禁止用語など異なる方式を組み合わせます。誤判定が起きていないか正常なフォーム送信も定期的に確認してください。

海外IPをすべてブロックすれば安全?

海外IP制限は、国内IPや別の経路を使うスパムには効きません。また、正当な海外利用者を止める可能性があります。国内限定のサイトで必要性が明確な場合に、対象ページを絞って使います。

XServerの国外アクセス制限でContact Form 7も止まる?

通常の公開フォーム全体を国別に拒否する機能とは異なります。XServerの設定画面で、管理画面、XML-RPC、REST APIなど何が制限対象になっているか確認してください。

設定後は何をテストすればよい?

国内回線で正常に表示・送信できることと、海外IPでは想定したページまたは機能が拒否されることを確認します。設定画面がONになっているだけでは、利用者側の動作確認にはなりません。

まとめ

Contact Form 7へ海外スパムが届く場合は、最初から海外アクセスを全面的に拒否せず、まずCloudflare Turnstile、日本語必須チェック、Akismet、禁止用語リストなどフォーム側の対策を行います。

海外IP制限は、国内ユーザーだけを対象にするサイトで、正当な海外利用を止めないと判断できる場合の追加策です。XServerのWordPress国外アクセス制限と、公開フォームページの国別ブロックも混同しないようにしてください。

そして、海外IP制限は設定しただけでは完了ではありません。海外IPから拒否され、国内回線では正常にフォームを利用できることまで確認して、初めてクライアントへ結果を報告できます。

海外IPからの確認方法は、ESET VPNでWordPressのアクセス制限を検証した手順で実画面とともに紹介しています。