どの問題が起きていますか?
3つのケースは似ていますが、原因は異なります。
- スパムが届く。 受信箱が広告、リンク、意味のないテキストで埋まります。フォームがボットを通しています。
- フォームがエラーを表示する。 訪問者には「There was an error trying to send your message. Please try again later.」と表示されます(他言語のサイトでは翻訳されています)。原因はスパム保護の場合も、メール送信の問題の場合もあります。
- 本物の問い合わせが届かない。 誰も苦情を言いませんが、何も届きません。その場合、保護が人を拒否しているか、メールが受信箱に届いていない可能性があります。
保護を追加する前に、まずどのケースかを特定してください。その方法は「メール配信か、ボット対策か?」の節で説明しています。
Contact Form 7自体が備えるもの
Contact Form 7には、スパム対策がいくつか組み込まれています(バージョン6.1.7で確認)。
- 禁止リスト。 CF7は、すべての送信を「設定 → ディスカッション」(「Disallowed Comment Keys」)のリストと照合します。一致すればスパムとみなされます。繰り返し現れる単語やドメインには有効ですが、新しいテキストには効きません。
- クイズフィールド。 タグ
[quiz]を使うと、フォームは自分で決めた質問を出します。どんなフォームにも入力するボットは失敗しますが、特定のサイトを狙って攻撃するボットは通過します。 - Akismet。 AkismetプラグインとAkismetキーがあれば、CF7は名前、メールアドレス、本文をAkismetサービスで確認します。
- reCAPTCHA v3。 CF7はGoogleからスクリプトを読み込み、スコアがしきい値を下回る送信を拒否します。
- Cloudflare Turnstile。 CF7はTurnstileを統合しています。スクリプトはCloudflareから読み込まれます。
禁止リストとクイズは外部サービスなしで動作します。Akismet、reCAPTCHA、Turnstileは訪問者のデータを各提供元に送信するため、プライバシーポリシーに記載する必要があります。
追加のボット対策が意味を持つとき
専用のボット対策が役立つのは、次のような場合です。
- 禁止リストとクイズを使ってもスパムが届き続ける
- GoogleやCloudflareからスクリプトを読み込みたくない
- 拒否された送信ごとに、拒否された理由を確認したい
クイズでフォームを十分に守れるなら、それ以上は必要ありません。誰も必要としない保護は、エラーの原因を一つ増やすだけです。
Contact Form 7向けにSilentShieldを設定する
公式プラグイン「SilentShield – Captcha & Anti-Spam」は、独自のコードなしでContact Form 7を保護します。Contact Form 7 6.1.7とWordPress 7.0でテスト済みです。
- WordPressのプラグインディレクトリからプラグインをインストールして有効化します。
- 「SilentShield → API / SilentShield」でキーを入力し、「Validate」をクリックし、「Activate API」をオンにして保存します。
- 「SilentShield → Forms」でContact Form 7をオンにします。
サイトはhttpsで動作している必要があります。そうでないとフォームを送信できません。すべての手順とテスト済みのフォームプラグインはWordPressガイドにあります。送信はすべてクォータに計上されます。料金とクォータをご覧ください。
本物の送信と失敗する試行をテストする
本物の送信: プライベートウィンドウでページを開き、フォームに手で入力して送信します。緑の枠線が付いたCF7の確認メッセージが表示されるはずです。
失敗する試行: 同じフォームを、ブラウザーを使わずにCF7のインターフェースへ送信します。フォームIDと_wpcf7_unit_tagの値は、ページのソースにあるフォームの隠しフィールドで確認できます。
curl -X POST "https://example.com/?rest_route=/contact-form-7/v1/contact-forms/123/feedback" \
-F "_wpcf7=123" -F "_wpcf7_unit_tag=wpcf7-f123-p45-o1" -F "_wpcf7_container_post=45" \
-F "your-name=Test" -F "[email protected]" -F "your-message=Test"
"status":"spam"を含むレスポンスが返るはずです。SilentShieldの場合、メッセージは「Behavior check」となります。
メール配信か、ボット対策か?
mail_sentspammail_failedvalidation_failedContact Form 7では、「スパム」と「メールを送信できませんでした」が同じ既定のテキストになっています。見分けられる場所は二つあります。
- メッセージの枠線の色: オレンジはスパム、赤はメール送信の失敗を意味します。ただし、テーマがCF7の色を上書きしていない場合に限ります。
- ブラウザーでのレスポンス: 開発者ツール(ネットワークタブ)では、
feedbackへのレスポンスにstatusが含まれ、その値はspamかmail_failedのどちらかです。
mail_failedであれば、ボット対策は送信を通しています。問題はWordPressのメール送信にあります。その場合は、たとえばSMTPプラグインを使ってメール設定を確認してください。spamであれば、いずれかの保護機能が拒否しています。SilentShieldの場合、メッセージに「Behavior check」のような理由が示されます。
限界
- 人が手で書いたスパムを防げる保護はありません。
- ブラウザーでJavaScriptが使えないと、保護されたフォームへの送信は拒否されます。
- SilentShieldはボットからフォームを守ります。WebアプリケーションファイアウォールやDDoS対策の代わりにはなりません。