ハニーポットのやり方【Contact Form 7】プラグイン無し

Webコーディング

ホームページのお問い合わせなどのフォームから届く営業メール等の迷惑メール対策について、有効だと言われているのが「ハニーポット」と呼ばれる方法です。

ハニーポットとは、画面には見えないひっかけ用の入力欄をフォーム内に仕込んで、機械的に送られる迷惑メールをブロックする方法です。

ほとんどの迷惑メールは自動送信プログラムなどで自動的に送られてきます。
そして、これらのプログラムは入力欄の全項目を埋めようとするため、ひっかけ用の入力欄に何か入力された場合、迷惑メールとしてブロックできます。

この記事では、【Contact Form 7】でお問い合わせフォームを作っている場合の、ハニーポットの方法を記載します。

【Contact Form 7】には、「Honeypot for Contact Form 7」という専用のプラグインがあるので、手軽に導入したい方はそちらを使った方がいいかもしれません。

私は、プラグインをむやみに増やしたくないので、手動でのやり方にしました。

ハニーポット導入の流れ【Contact Form 7】

①問い合わせフォーム内に入力欄を追加

②CSSで①のフォームを非表示

③制御するコードを追加
内容:①のフォームに入力がある場合、問い合わせを送信しない

④【強化版】ハニーポットを複数設置

⑤【強化版】制御するコード

①問い合わせフォーム内に入力欄を追加

迷惑メール対策をしたいフォームに入力欄を追加する。

<div class="contact-wrap">
<label> 会社名
[text company] </label>
</div>

フォーム欄の[name]に当たる値(ここでは「company」)は、現状のフォームで使用していないもので、重要度が高そうなものにしてください。
(例:company,title,urlなど)

②CSSで①のフォームを非表示

①にて追加した部分を表面上では見えなくします。

.contact-wrap {
    position: absolute;
    left: -9999px;
}

[display:none;] や [opacity:0;] は、機械的に見た場合に認識されなくなる可能性もあるので、画面上で見えない位置に置くのがいいと思います。

③制御するコードを追加

「functions.php」に以下のコードを追加します。

//コンタクトフォーム対策
add_filter( 'wpcf7_validate', 'cf7_honeypot_validation', 10, 2 );
function cf7_honeypot_validation( $result, $tags ) {

  // honeypot フィールド名
  $honeypot_fields = array(
    'company',//ここに①のnameの値を入れる
  );

  foreach ( $honeypot_fields as $field ) {
    if ( isset( $_POST[ $field ] ) && $_POST[ $field ] !== '' ) {
      $result->invalidate(
        new WPCF7_FormTag( array(
          'name' => $field,
          'type' => 'text'
        ) ),
        ''
      );
      // これ以上処理しない
      return $result;
    }
  }
  return $result;
}

これで、①の入力欄に値が入った場合にはエラーになり、メールが送信されなくなります。

ここで一応、制御できているかテストを行ってください。
(普通に入力した場合はお問い合わせメールが送られてくるか、①の入力欄に値が入った場合はメールが送られないか)

④【強化版】ハニーポットを複数設置

より迷惑メール対策を強化するには、ハニーポットを複数設置するのが有効です。

①をフォーム内に複数追加します。

⑤【強化版】制御するコード

複数のハニーポットを制御するためのコードは以下になります。

「functions.php」を書き換え

//コンタクトフォーム対策
add_filter( 'wpcf7_validate', 'cf7_honeypot_validation', 10, 2 );
function cf7_honeypot_validation( $result, $tags ) {

  // honeypot フィールド名
  $honeypot_fields = array(
    'company',//ここに①のnameの値を入れる
    '○○',//ここに①のnameの値を入れる
    '△△',//ここに①のnameの値を入れる
  );

  foreach ( $honeypot_fields as $field ) {
    if ( isset( $_POST[ $field ] ) && $_POST[ $field ] !== '' ) {
      $result->invalidate(
        new WPCF7_FormTag( array(
          'name' => $field,
          'type' => 'text'
        ) ),
        ''
      );
      // これ以上処理しない
      return $result;
    }
  }
  return $result;
}

注意点

ハニーポットは、あくまでも自動入力による迷惑メールを対策するものです。
手動入力による営業メールは対策できません。

手動入力による営業メールを対策する場合には、例えばフォームの注意書きに「営業目的でのお問い合わせはお断りします」という文言を記載することや、「営業目的ではない」といったチェック項目を追加する、などが有効かと思います。

「MW WP Form」の場合のハニーポットのやり方については、後日記載予定です。