ワードプレス内に設置したお問い合わせフォーム(Contact Form 7)へ大量に届く海外スパムメールを賢く禁止にする方法

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

最近、ワードプレスの無料プラグイン「Contact Form 7」を狙ったスパムメールツールが流行っています。スパムメールが数十分おきに届くので詳しく調べてみると「マーケティングツール」として提供している企業を発見しました。翻訳しながら読み進めてみると「数千万個以上運用されているワードプレスサイトのお問い合わせフォームに直接アプローチできるツールを開発しました」との誘い文句。。。

そんなツールに効果があるかはご想像の通りですが、信頼関係も構築していない状態でいくら効率的にフォームから営業活動をしても全部スルーされるのがオチです。人気サイトになるとこのように「個人情報自動収集ツールのターゲットにされる」のは仕方ありませんが、私たち開発エンジニアはそういった迷惑行為をいち早く見つけ出して対策方法を考えるのも大切な任務だと思っています。

実際はイタチごっこでキリがありませんが対策は随時行う必要があります。Contact Form 7ではフォーム利用者に「自動返信メール」が送られるので、収集ツールのターゲットにされている間はずっと「メールを連続で送信してしまう」ため検索エンジン(Google)的には「頻繁にメール配信する迷惑サイト」に扱われる可能性が出てきます。たとえ誤判定とはいえ「メールを配信しつづけている状況」だからです。

仮に『スパムメールを配信し続けているドメイン』としてGoogle側に認識されると「その独自ドメインからGmailへのメール配信もできなくなる」場合があるので注意しましょう。解決策は、スパムメールの大半が概ね英語なので「お問い合わせ本文に2バイト文字(主に日本語)が含まれない場合はフォーム側でエラーメッセージを出す」という処理を行なう方法。下記を「functions.php」へ追記すればOKです。

//スパム対策(Contact Form7用)
function wpcf7_validate_anti_spam_message( $result, $tag ) {
	$value = str_replace(array(PHP_EOL,' '), '', esc_attr($_POST['your-message']));
	if (!empty($value)) {
		if (preg_match('/^[!-~]+$/', $value)) {
			$result['valid'] = false;
			$result['reason'] = array('your-message' => 'お問い合わせ内容は日本語で入力してください');
		}
	}
	return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_anti_spam_message', 10, 2 );

もし「本文(your-message)」ではなく、「件名(your-subject)」に適用したい場合は下記のように置き換えればOKです。

//スパム対策(Contact Form7用)
function wpcf7_validate_anti_spam_message( $result, $tag ) {
	$value = str_replace(array(PHP_EOL,' '), '', esc_attr($_POST['your-subject']));
	if (!empty($value)) {
		if (preg_match('/^[!-~]+$/', $value)) {
			$result['valid'] = false;
			$result['reason'] = array('your-subject' => '件名は日本語で入力してください');
		}
	}
	return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_anti_spam_message', 10, 2 );

また、Contact Form 7の設定状況で「your-message」や「your-subject」を使わずに「text-476」や「textarea-762」などでフォームを作っている場合は記述箇所を微調整しましょう。設定自体は難しくないですが導入はウェブサイトの運用状況を考慮しつつお試しください。

▼「your-subject」ではなく「text-476(値は環境による)」を使っている場合

//スパム対策(Contact Form7用)
function wpcf7_validate_anti_spam_message( $result, $tag ) {
	$value = str_replace(array(PHP_EOL,' '), '', esc_attr($_POST['text-476']));
	if (!empty($value)) {
		if (preg_match('/^[!-~]+$/', $value)) {
			$result['valid'] = false;
			$result['reason'] = array('text-476' => '日本語で入力してください');
		}
	}
	return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_anti_spam_message', 10, 2 );

▼「your-message」ではなく「textarea-762(値は環境による)」を使っている場合

//スパム対策(Contact Form7用)
function wpcf7_validate_anti_spam_message( $result, $tag ) {
	$value = str_replace(array(PHP_EOL,' '), '', esc_attr($_POST['textarea-762']));
	if (!empty($value)) {
		if (preg_match('/^[!-~]+$/', $value)) {
			$result['valid'] = false;
			$result['reason'] = array('textarea-762' => '日本語で入力してください');
		}
	}
	return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_anti_spam_message', 10, 2 );

さらにルールを厳しくする場合は下記でもOKです。以下はお問い合わせ本文内(textarea)に「ひらがな」が存在しない場合のお問い合わせをすべてはじくという処理となっています。お問い合わせフォームを使うのは日本語の入力ができる方のみとなりますが効果は抜群です。

//Contact Form 7の <textarea> にひらがなが含まれない場合はエラーを表示させる
function wpcf7_validation_textarea_hiragana_check($result, $tag) {
	$name = $tag['name'];
	$value = (isset($_POST[$name])) ? (string) $_POST[$name] : '';
	if ($value !== '' && !preg_match('/[ぁ-ん]/u', $value)) {
		$result['valid'] = false;
		$result['reason'] = array($name => 'この内容は送信できません。');
	}
	return $result;
}
add_filter('wpcf7_validate_textarea', 'wpcf7_validation_textarea_hiragana_check', 10, 2);
add_filter('wpcf7_validate_textarea*', 'wpcf7_validation_textarea_hiragana_check', 10, 2);

色々な書き方を記載しましたが1つずつ試して改善したものを採用するのがベストです。

時期によって流行のスパムツールも違いますが、狙われる環境は人それぞれです。お問い合わせフォームの動作範囲を日本語のみに絞ってもよければ最後に記述した「ひらがな」が存在しない場合は全部弾いてしまうのがもっとも手っ取り早いかもしれません。

スパムメールが連続していてお困りだった場合はぜひ一度お試しくださいませ。

最新式の無料プラグインを事前公開

WordPressは公式サイトに登録されているプラグインだけでは機能を補足しきれません。当サイトでは使いやすさを追求した魅惑的なプラグイン無料でダウンロードいただけます。運営ホームページのマーケティング力をさらに高めるチャンスです。まずは無料でDLしてお試しくださいませ。
改良されたプラグインを確認する