Contact Form 7でスパムを防止する方法

Contact Form 7でスパムを防止するために、このサイトで実施していることを紹介します。
reCAPTCHAのボタンを非表示にする方法も合わせて紹介します。

1. Throws SPAM Awayを有効化する

スパム対策と言えば、WordPressをインストールすると、最初から入っているプラグイン「Akismet」ですが、「Throws SPAM Away」は海外からのスパムを排除するプラグインです。日本語がないと、送信できないようになっています。

次にfunction.phpに以下の記述を追加します。

/**
 *  IPアドレスチェック(ホワイトリストチェック・ブラックリストチェック)
 *  で引っかかった場合は「不明なエラーで送信できません」と返却し
 *  その他のチェックはそれぞれエラー文言を返却します。
 *  Throws SPAM Awayの設定どおりチェックしますので設定を忘れずに。
 */
function wpcf7_validate_your_message( $result, $tag ) {

 include_once( WP_PLUGIN_DIR.'/throws-spam-away/throws_spam_away.class.php');

        $throwsSpamAway = new ThrowsSpamAway();

        $args = array(
              'post_id' => NULL
            );
        $value = esc_attr( $_POST['your-message'] );

        if ( !empty( $value ) ) {

            // IPアドレスチェック
            $ip = $_SERVER['REMOTE_ADDR'];
            // ホワイトリスト判定は IPがホワイトリストに入っていることがOKだった経緯から
            // 入っていることがTRUEで入っていないことがFALSEになっています。
            // そのため、一見ややこしいですが、IPアドレスチェックと合わせるためフラグを反転しています。
            $white_ip_check = !$throwsSpamAway->white_ip_check( $ip );

            // こちらのIPアドレスチェックはブラックリスト判定ですので入っている=FALSEです。
            $chk_ip = $throwsSpamAway->ip_check( $ip );

            // ホワイトリストに入っていない または ブラックリストに入っている 場合はエラーとします。
            if ( ! $white_ip_check || ! $chk_ip ) {
              $result['valid'] = false;
              // エラー文言はなんでもいいのですがIP制限しているのがバレたくない場合は
              // うやむやなエラー文言が良いと思います。
              $result['reason'] = array( 'your-message' => '不明なエラーで送信できません :');
              return $result;
            }

            // IPアドレスチェックを超えた場合は通常のスパムチェックが入ります。
            $chk_result = $throwsSpamAway->validate_comment( "", $value, $args);

            // エラーがあればエラー文言返却
            if ( !$chk_result ) {
                // エラータイプを取得
                $error_type = $throwsSpamAway->error_type;
                $message_str = "";
                /** 
                    エラー種類
                    'must_word'         必須キーワード
                    'ng_word'           NGキーワード
                    'url_count_over'    リンク数オーバー
                    'not_japanese'      日本語不足
                */
                switch ( $error_type ) {
                    case "must_word":
                        $message_str = "必須キーワードが入っていないため送信出来ません ";
                        break;
                    case "ng_word":
                        $message_str = "NGキーワードが含まれているため送信できません ";
                        break;
                    case "url_count_over":
                        $message_str = "リンクが多すぎます ";
                        break;
                    case "not_japanese":
                        $message_str = "日本語が含まれないか日本語文字数が少ないため送信出来ません ";
                        break;
                    default:
                        $message_str = "エラーが発生しました:".$error_type;
                }
                $defaults = array(
                    'message' => $message_str
                );
                $result['valid'] = false;
                $result['reason'] = array( 'your-message' => $message_str);
                return $result;
            }

        }
  return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_your_message', 10, 2 );

※Throws SPAM Awayを作った方が執筆した、下記サイトを参考にしています。

英語だけで入力して、送信しようすると、下記のようなエラーが起きて、送信を防ぐことができます。

2. reCAPTCHA (v3)を有効化する

reCAPTCHA (v3)を有効化して、ロボットからのスパムを防止します。reCAPTCHAはGoogleが作った人間かロボットかを判断するプログラムで、よくある横断歩道の写真を選ぶやつです。

①reCAPTCHAのkeyを取得する

 My reCAPTCHA にアクセスします。下記の様な画面が出てくるので、必要事項を入力して送信ボタンを押します。

すると、下記の様な画面に変わり、サイトキーとシークレットキーが発行されるます。

②keyをContact Form 7に登録する

WordPressのダッシュボードの左側にある「お問い合わせ」→「インテグレーション」を選びます。

下記の画面が開くので、「インテグレーションのセットアップ」を押します。

下のような画面が開くので、先程取得したKeyを入力します。

変更を保存を押すと、以下の画面に変わります。

以上で設定は完了です。

③reCAPTCHAのボタンを非表示にする

このままだと、reCAPTCHAのボタンが中々の存在感があるので、非表示にします。

GoogleのreCAPTCHAのFAQによると、以下の文言を表示した場合は、ボタンを非表示にしていいそうです。

このサイトはreCAPTCHAとGoogleによって保護されています
<a href="https://policies.google.com/privacy">プライバシーポリシー</a>および
<a href="https://policies.google.com/terms">利用規約</a>が適用されます。

消す場合は、style.cssに以下を記述します。

.grecaptcha-badge { visibility: hidden; }

これでreCAPTCHAのボタンを非表示にすることができました。

番外編:チェックボックスを追加する

下記の記事によると、誤送信を防ぐためにチェックボックを追加したら、スパムが止まったそうです。

Contact Form 7の適当な位置に、次のように追加します。

[acceptance acceptance-0]&nbsp;確認ページはございません。内容をご確認の上チェックを入れてください

確認ページはないということを、お知らせしています。

以上、Contact Form 7でスパムを防止するために、このサイトで実施していることを紹介しました。