スパム対策としてメール設定とIPアドレスを限定した話【追記あり】

📝 2025年追記

この記事で紹介しているIPアドレス制限によるスパム対策は、SNSのブログカードが表示されなくなる等の問題があり現在は使用していません。現在は reCAPTCHA やハニーポット方式など、より効果的な対策が主流です。体験談としてお読みください。

弊社のホームページはWordPressを使用しており、メールに関してはプラグインの「Contact Form 7」を使用しています。

このプラグインは世界的にも有名なため、悪いことをしようとする人たちも少なくはありません。そのため何も設定していないところにはスパムメールや営業メールがわんさか届きます。

中には登録した覚えがないにも関わらず「配信解除はこちらから」というような内容のメールも届くため、ストレスを感じスパムの対策を考えておりました。

この記事では当時試みた2つのアプローチを紹介します。

📝 この記事の内容

① Contact Form 7 の拡張プラグインでステップ式フォームを作成
② .htaccess で日本国内のIPアドレスだけアクセスを許可 → 断念

Contact Form 7のステップ化

すでにプラグインを使っていることを想定して記載していきます。

新規プラグインの取得・設定

新規プラグインから「Contact Form 7 Multi-Step Forms」と検索して今すぐインストールを行った後にプラグインを有効化します。

Multi-Step Formsプラグインの検索画面
新規プラグインから「Multi-Step Forms」を検索してインストール

インストール後はContact Form 7に新しくボタンが追加されています。

Contact Form 7に追加されたmultistepボタン
「multistep」ボタンが追加される

確認ページ用のメールフォームを作成

Contact Form 7より新規作成でフォームの追加をします。

確認画面ページ用のフォーム新規作成
後から管理しやすいように「確認画面ページ」と名前を付けています

既存で設定していたContact Form 7の内容をまるっとそのままコピーしておきます。

固定ページの追加

今回の場合は3ページでお問合せフォームを構成していきます。

  • 入力画面 — お問合せの記入ページ
  • 確認画面 — 入力内容のプレビュー
  • サンキュー画面 — 送信完了ページ

固定ページの新規作成から名前とスラッグを決めて保存をしておきます。

コードの編集

まずは既存で動かしていたフォームを少し編集していきます。

送信ボタンにあたる [submit "送信"] を [submit "次へ"] に変更し、続けて次の行に拡張プラグインから追加された「multistep」を押してコードを追加します。

multistepの設定画面
multistepの設定項目

💡 multistepの設定項目

• First Step — 初めのステップならチェック
• Last Step — 最後のステップならチェック
• Send Email — このステップでメールを送る
• Skip Save — データベースを残す(フラミンゴなどの顧客管理用)
• Next Page URL — 移行先のURL

既存であったお問合せフォームは最初のステップになりますので「First Step」にチェックを入れ、「Next Page URL」に確認画面用のスラッグ(URL)を記載します。

確認画面では「Last Step」と「Send Email」にチェックを入れ、サンキュー画面に向かうように指示をしてコードを挿入します。

確認画面側のmultistep設定
確認画面側のmultistep設定

それに加え、入力した内容が確認画面として表示できるように先ほどコピーしたコードを編集します。

⚠️ 確認画面のコード変換

Contact Form 7の通常のコード [text your-name] を [multiform "your-name"] に変えていきます。他の箇所にも同じように記載し保存を行います。

続けてフォームを表示させるため、作成した固定ページにContact Form 7のショートコードを記載するか、WordPressのテンプレートにショートコードを埋め込みます。

弊社ではテンプレートにショートコードを埋め込んでいますので、その方法もご紹介いたします。下記の do_shortcode() がショートコードを出力する関数になります。

<?php echo do_shortcode('

エラー: コンタクトフォームが見つかりません。

');?>

テンプレートに記載の際は if 文でContact Formの分岐をして入力・確認・サンキューと画面を表示していけます。

完成画面

入力ページ

ステップ式フォームの入力画面
STEP 1 — 入力ページ

確認ページ

ステップ式フォームの確認画面
STEP 2 — 確認ページ

サンキューページ

ステップ式フォームのサンキュー画面
STEP 3 — サンキューページ

⚠️ ステップ化だけではスパムは防げない

ステップ式フォームはユーザー体験の向上には役立ちますが、スパム対策としては不十分です。ボットはフォームのPOSTエンドポイントに直接送信するため、画面のステップを踏む必要がありません。スパム対策には別途 reCAPTCHA 等の導入が必要です。

参照ページ

国内だけのアクセス制限(断念)

グローバルの集客は考えておらず、スパムの原因を根こそぎ潰すため日本国内のIPアドレスだけアクセスできるようにして海外からのアクセスを拒否する設定を試みました。

WordPressをお使いの際はサーバーの一番上にある階層の .htaccess ファイルを操作します。

⚠️ 注意

.htaccess の操作を間違えるとサイトが表示されなくなる可能性があります。編集前に必ず元のコードをバックアップしてください。

内容は下記のサイトを参考にさせていただきました。コードは # BEGIN WordPress の上に記載します。

海外からのアクセス(IP)を拒否する方法と注意点【.htaccess】

### 検索エンジンをまとめて許可するためにenv化する
SetEnvIf User-Agent "Googlebot" allowbot
SetEnvIf User-Agent "msnbot" allowbot
SetEnvIf User-Agent "bingbot" allowbot
SetEnvIf User-Agent "Slurp" allowbot

### いったん全てを拒否する
order deny,allow
deny from all

### 検索エンジンからのアクセスを許可
allow from env=allowbot

### SearchConsoleのプロパティ確認用
allow from googlebot.com
allow from google.com

### 日本国内のIPを許可
### 国内IP取得先)http://www.cgis.biz/tools/access/
allow from 1.0.16.0/20
allow from 1.0.64.0/18
(以下、国内IPアドレスが続く…)

この方法で起きた問題

設定自体は動作しましたが、以下の問題が発生し元に戻すことになりました。

  • SNSのブログカードが表示されない — Twitter・Facebook・LINEのクローラーは海外IPからアクセスするため、OGP情報を取得できずカードが生成されなくなった
  • 海外サービスとの連携が切れる — 決済サービス・アナリティクス・CDNなど、海外IPからのアクセスが必要なサービスも影響を受ける可能性がある
  • IPアドレスの維持管理が大変 — 国内IPレンジは頻繁に変わるため、定期的な更新が必要
  • Apache 2.4以降では構文が異なる — order deny,allow は Apache 2.2 の構文で、2.4以降では Require ディレクティブを使う必要がある

💡 学んだこと

IPアドレスでの制限は「全部遮断して必要なものだけ許可する」という考え方ですが、現代のWebサイトは多数の外部サービスと連携しているため、想定外の影響が出やすいアプローチでした。

現在おすすめのスパム対策

IP制限に代わり、現在は以下の方法が効果的かつ副作用が少ないスパム対策として主流になっています。

  • reCAPTCHA v3 — Googleが提供するボット判定。ユーザーの操作不要でスコアベースの判定を行う
  • Cloudflare Turnstile — Cloudflareの代替CAPTCHA。プライバシーに配慮した設計
  • ハニーポット方式 — 人間には見えない隠しフィールドを設置し、入力があればボットと判定する
  • Akismet — WordPress標準のスパムフィルター。コメントだけでなくフォーム送信にも対応

💡 おすすめの組み合わせ

Contact Form 7 であれば reCAPTCHA v3(プラグイン標準で対応済み)+ハニーポット(「Honeypot for Contact Form 7」プラグイン)の併用が手軽で効果的です。設定も数分で完了します。

まとめ

✅ この記事のまとめ

① Multi-Step Formsでのステップ式フォーム → UX向上には有効だがスパム対策にはならない
② .htaccess でのIP制限 → SNS連携が壊れるため断念
③ 現在のおすすめ → reCAPTCHA v3 + ハニーポットの併用

この記事を書いた人

スギちゃん杉原 優介

ましろ未来図で制作を担当。

読んでいただき、ありがとうございます。
ましろ未来図は、松江の制作チームです。

ブログや番組で話しているようなことを、ふだんはお客さまと一緒にやっています。「うちの場合はどうなんだろう?」と思ったら、気軽に聞いてください。

Read next

制作のうらがわ2023.04.03

WordPress備忘録-カスタム投稿タイプ編

スギちゃん・制作
制作のうらがわ2022.07.05

Dreamweaverを使ったWordPressのテーマ制作-応用編-

スギちゃん・制作
制作のうらがわ2022.06.21

見積フォーム「AForms」の使い方

スギちゃん・制作