Защита Contact form 7 от спама без капчи

Contact form 7 является одним из самых популярных плагинов формы обратной связи на wordpress, в связи с чем его облюбовали различные программы для рассылки своего спама. Вариантов защиты формы масса и самый очевидный с которым у Cf7 есть встроенная интеграция это google recaptcha, к сожалению она не спасает от спама, как v2 версия, так и v3. Ниже предложу пару вариантов защиты contact form 7 от спама без использования капчи (хотя та же капча с картинками неплохо справляется со спамом, можете поискать плагины в каталоге плагинов вордпресс, если вас устраивает такой вариант)

Honeypot for Contact Form 7

Самый простой вариант это плагин Honeypot. Его работа заключается в том, чтобы добавлять невидимые поля, при заполнении которых срабатывает антиспам, т.к. реальный человек их заполнить не может. Так же в плагине можно выставить проверку задержки перед заполнения поля , т.е. чаще всего бот откроет станицу и тут же автоматически вобьет данные и отправит, а реальный человек пока введет все данный пройдет как минимум 10-15 секунд . Настройка достаточна проста, добавляете как обычных тег Cf7 в любое место формы, проставляете все чекбоксы, ставите нужную вам задержку и для лучшей надежности меняете название поля на что-то более человеческое, например email, phone, website, first-name, last-name, zip и т.п.

Вариант защиты формы от спама с помощью js кода

Простой сниgпет, который нужно добавить в functions.php. Принцип его работы похож на плагин Honeypot for Contact Form 7. Мы добавляем скрытое поле, называем его как нибудь по человечески, в моем случае это first-name (только латинские символы). Далее добавляем простой jQuery код, который с задержкой (в моем случае это 5000мс, т.е. 5 секунд) добавляет значение (в моем примере это слово human) в скрытое поле. Во время отправки формы проверяем значение скрытого поля. Это поможет отсечь массу автоматического спама, например ботов которые вообще не эмулируют браузер, т.к. не сработает js или например ботов, которые моментально захотят отправить форму зайдя на страницу, а так же ботов, которые попытаются заполнить поле своим значением

[hidden first-name]
// jQuery скрипт добавления занчения в скрытое поле с задержкой 
function cf7antispam_script()
{ ?>
  <script type="text/javascript">
    jQuery(document).ready(function($) {
      setTimeout(() => {
        jQuery('input[name="first-name"]').val('human');
      }, 5000);
    });
  </script>
<?php }
add_action('wp_footer', 'cf7antispam_script');

// проверка значения поля
function cf7antispam($spam)
{
  if ($spam) {
    return $spam;
  }

  if (trim($_POST['first-name']) !== 'human') {
    $spam = true;
  }
  return $spam;
};
add_filter('wpcf7_spam', 'cf7antispam', 10, 1);

Все, простейший анитспам без гугул капчи (которая неплохо так виляет на google page speed). В случае спама форма покажет стандартное сообщение «При отправке сообщения произошла ошибка. Пожалуйста, попробуйте ещё раз позже.«

Защита от спама на примере валидации textarea

По моим наблюдения, если на сайте есть форма Contact form 7, где содержится текстовое поле, то такие формы чаще подвергаются спам атаке. Это логически объясняется тем, что через такую форму можно отправить полноценное рекламное сообщение. Так что одним методом борьбы со спамом может быть не использовать форму комментария при сборе контактных данных)

Через валидацию textarea можно легко отсеять большинство спам сообщений, т.к. часто в них содержатся html теги, ссылки, майлы и т.п. Ниже приведу пример кода, который поможет решить эту проблему:

// Поиск заданных значений из набора
function multineedle_stripos($haystack, $needles, $offset = 0)
{
  foreach ($needles as $needle) {
    if (stripos($haystack, $needle, $offset) !== false) {
      return true;
    }
  }
  return false;
}

// валидируем поле textarea
function cf7customValidationTextarea($result, $tag)
{
  if ('textarea-184' == $tag->name) {
    // массив запрещенных слов, тегов и т.п.
    $needle = array("http", "https", "href", "<a>", "<p>", "<span>", "@");

    // сообщение при наличии слов из списка
    if (multineedle_stripos($_POST['textarea-184'], $needle)) {
      $result->invalidate($tag, "Текст содрежит недопустимые символы");
    }
  }
  return $result;
}
add_filter('wpcf7_validate_textarea*', 'cf7customValidationTextarea', 10, 2);
add_filter('wpcf7_validate_textarea', 'cf7customValidationTextarea', 10, 2);

Здесь все достаточно просто, с помощью функции multineedle_stripos мы ищем запрещенные слова, теги и т.п. в текстовом поле (textarea-184) и при наличии их выдаем сообщение об ошибке валидации. Этот способ поможет отсеять львиную долю спам сообщений