Как выглядит спам в формах и почему он бьёт по продажам
Сайт стоит полгода, форма обратной связи работает, и однажды менеджер открывает почту и видит там сорок писем за ночь. Половина на латинице про SEO-услуги, четверть с китайскими иероглифами, остальное просто набор символов. Живая заявка в этой куче тоже есть, но её нашли только к обеду.
Дальше сценарий развивается по одному из двух путей. Либо менеджер перестаёт открывать ящик формы и заявки начинают теряться уже системно. Либо кто-то в спешке настраивает фильтр в почте, тот срабатывает слишком широко, и настоящие письма от клиентов уходят в папку «Спам» вместе с мусором. Второй вариант хуже, потому что выглядит как решённая проблема.
Ещё одно последствие заметно не сразу. Если форма привязана к CRM, каждая спам-отправка создаёт лид. Через месяц в воронке лежит триста мусорных записей, отчёты по конверсии перестают что-либо значить, а руководитель отдела видит рост заявок при падении продаж.
Защита форм от спама на WordPress собирается из готовых частей и почти не требует программирования. Сложность в другом: ставить всё подряд не нужно, потому что лишние барьеры режут конверсию сильнее, чем спам режет нервы. Ниже механизмы, которые есть в распоряжении, что каждый из них реально делает и в каком порядке их подключать.
Откуда берётся спам в формах
Основной поток дают автоматические боты, которые обходят сайты, находят теги <form> и отправляют POST-запрос со всеми полями. Такому боту не нужно рендерить страницу и выполнять JavaScript, он работает с HTML-кодом напрямую. Именно поэтому проверка, встроенная в браузерный сценарий, оказывается для него неожиданной преградой.
Второй источник, это целевые рассылки по базе сайтов. Кто-то собрал список ресурсов на WordPress с плагином Contact Form 7, определил структуру полей и рассылает предложения по этой базе. Такие отправки выглядят осмысленнее и часто содержат реальный текст.
Третий, самый неприятный, это ручной спам. Человек заходит на сайт, заполняет форму и отправляет предложение купить ссылки. Против него бессильны и капча, и honeypot, потому что перед формой действительно сидит человек. Здесь работают только фильтры по содержимому.
Отсюда и главный принцип: одна мера закрывает один класс атак. Комбинация из двух-трёх разнородных механизмов даёт результат, которого не даст ни одна из них по отдельности.
Honeypot: самый дешёвый барьер
Honeypot, или поле-ловушка, устроен предельно просто. В форму добавляется дополнительное поле, скрытое от посетителя средствами CSS. Живой человек его не видит и не заполняет, а бот, который разбирает HTML и подставляет значения во все найденные поля, попадается. Если ловушка заполнена, отправка отбрасывается.
Про Contact Form 7 честнее сказать прямо: в самом плагине этого механизма нет, его добавляют отдельным расширением. Плагин с honeypot-полем для CF7 стоит более чем на 300 тысячах сайтов и добавляет в форму собственный тег, который вставляется в шаблон наравне с обычными полями. В версии 3.7.0 и новее защита построена на подписанных токенах, без опоры на серверные transient-записи, поэтому механизм переживает кэширование страниц. Последнее важнее, чем кажется: на сайте с агрессивным кэшем многие защиты ломаются именно потому, что зависят от сессии.
Что даёт honeypot: отсекает основную массу примитивных ботов, не требует от посетителя ни одного лишнего действия, никак не влияет на конверсию и не отправляет данные пользователей во внешние сервисы. Чего не даёт: он бесполезен против ручного спама и против продвинутых ботов, которые проверяют видимость поля перед заполнением.
Поэтому honeypot ставят первым, но не единственным.
Akismet: фильтр по содержимому
Akismet, это антиспам-сервис от Automattic, той же компании, что стоит за WordPress.com. Он проверяет содержимое отправки по своей базе и возвращает вердикт «спам» или «не спам». В экосистеме Contact Form 7 автор плагина называет фильтрацию через Akismet центральным элементом всей стратегии защиты.
Работает это не автоматически, и здесь чаще всего ошибаются при настройке. Мало установить и активировать плагин Akismet. Нужно ещё указать самому Contact Form 7, какие поля формы что означают, через опции у тегов формы: akismet:author для поля с именем, akismet:author_email для поля с электронной почтой, akismet:author_url для поля с адресом сайта. Без этих опций CF7 не знает, что именно передавать в сервис, и фильтрация просто не включается.
Когда всё размечено, при отправке формы Contact Form 7 передаёт в Akismet все введённые пользователем данные вместе с переменными окружения, а сервис отвечает вердиктом.
Проверить настройку можно, не дожидаясь реального спама. Автор плагина описывает тестовые значения: строка «viagra-test-123» в поле имени, размеченном как akismet:author, или адрес «akismet-guaranteed-spam@example.com» в поле почты гарантированно вернут ответ «спам». Если после подстановки тестового значения форма отправилась нормально, значит разметка полей не работает и защиты у вас нет.
Сильная сторона Akismet в том, что он единственный из перечисленных механизмов работает против ручного спама: человек, который печатает предложение купить ссылки, попадает в ту же базу шаблонных текстов. Слабая сторона в том, что данные отправителя формы уходят стороннему сервису. Для сайта, который собирает персональные данные, это стоит отразить в политике конфиденциальности.
Капча: reCAPTCHA v3 и Cloudflare Turnstile
Классическая капча с картинками и светофорами постепенно уходит, и это к лучшему: каждое лишнее действие перед отправкой формы стоит заявок. Современные механизмы работают в фоне.
Contact Form 7 начиная с версии 5.1 использует API reCAPTCHA v3. Пользователю здесь ничего не показывают, вместо этого сервис возвращает score от 0.0 до 1.0, где 1.0 означает почти наверняка живого человека, а 0.0 почти наверняка бота. Плагин сравнивает оценку с порогом, и если она ниже, отправка считается спамом. Значение порога по умолчанию 0.50. Сам Google рекомендует начинать с 0.5 и корректировать по результатам анализа трафика, а при низкой оценке предлагает действовать мягко, например отправлять сомнительные обращения на модерацию вместо жёсткой блокировки.
Второй вариант появился недавно и во многих случаях удобнее. В Contact Form 7 версии 6.1 добавлен модуль интеграции с Cloudflare Turnstile. Ключевой момент, о котором часто спрашивают: Turnstile встраивается в любой сайт и не требует пропускать трафик через Cloudflare, то есть переносить домен или менять DNS не нужно. Виджет доступен в трёх режимах: managed, когда система сама решает, показывать ли посетителю чекбокс, non-interactive без взаимодействия и invisible, полностью скрытый от глаз. Cloudflare рекомендует managed.
Настройка выглядит так. В панели Cloudflare создаётся виджет Turnstile, оттуда берутся site key и secret key. Затем в админке WordPress открывается раздел «Контактные формы», далее «Интеграция», и в блоке Turnstile нажимается настройка интеграции, куда ключи и вставляются. После этого виджет автоматически появляется во всех формах сайта, по умолчанию сверху. Если положение не устраивает, в шаблон формы вставляется тег [turnstile], и виджет встанет туда, где вы его поставили.
Сам разработчик Contact Form 7 отмечает, что Turnstile работает не хуже reCAPTCHA от Google, и рекомендует его пользователям плагина. Для казахстанского сайта у Turnstile есть и побочный плюс: меньше зависимости от доступности сервисов Google на конкретном соединении посетителя.
Список запрещённых слов: последняя линия
Механизм, о котором вспоминают реже всего, встроен в сам WordPress и не требует ничего устанавливать. Contact Form 7 умеет пользоваться штатным списком запрещённых значений, который живёт в админке в разделе «Настройки», далее «Обсуждение».
В этом разделе два похожих поля, и путать их не стоит. Поле модерации комментариев отправляет совпадения в очередь на проверку. А поле «Ключи запрещённых комментариев» работает жёстче: совпадения удаляются немедленно и без уведомления. В официальной документации WordPress к этому пункту стоит прямое предупреждение быть осторожным, поскольку настоящий комментарий может исчезнуть без следа.
Вносить туда можно слова, адреса электронной почты, IP-адреса и регулярные выражения, по одному значению на строку. Для форм это удобно, когда спам однотипный: одна и та же ссылка, один и тот же домен отправителя, повторяющаяся фраза на латинице в поле, где вы ждёте текст на русском.
Работает такой список только против того, что вы уже видели, поэтому и называется последней линией. Зато он бесплатный, мгновенный и не отправляет никуда никаких данных.
Если формы собраны не на Contact Form 7
Всё описанное выше опирается на конкретный плагин, и это не случайность: Contact Form 7 установлен более чем на десяти миллионах сайтов, так что шанс встретить его на корпоративном сайте очень высок. Но формы на WordPress собирают и другими инструментами, а на сайтах, сделанных на конструкторе страниц, форма часто является частью самого конструктора.
В такой ситуации переносится логика, а конкретные шаги настройки придётся искать заново. Четыре класса защиты остаются теми же: скрытая ловушка для ботов, фоновая проверка посетителя, фильтр по содержимому и чёрный список значений. Меняются только названия настроек и место, где их искать.
Что обязательно нужно проверить в чужом инструменте, прежде чем считать форму защищённой. Есть ли встроенный honeypot и включён ли он по умолчанию, потому что во многих сборщиках форм он есть, но выключен. Поддерживается ли Turnstile или только reCAPTCHA, и какой именно версии. Передаются ли данные в Akismet и требуется ли для этого отдельная разметка полей, как в Contact Form 7. Переживает ли защита кэширование страниц, если на сайте стоит кэш-плагин или CDN.
Последний пункт стоит отдельного внимания. Механизмы, которые опираются на серверную сессию или одноразовый токен, привязанный к моменту генерации страницы, на закэшированной странице ведут себя непредсказуемо: у одних посетителей форма отправляется, у других выдаёт ошибку проверки. Диагностировать это тяжело, потому что у администратора, который залогинен и видит страницу мимо кэша, всё работает. Если после подключения защиты часть клиентов жалуется, что форма не отправляется, начинать проверку стоит именно отсюда.
Что собрать в итоге и в каком порядке
Сначала honeypot. Он ничего не стоит, ничего не ломает и снимает основную массу шума. Уже на этом шаге поток спама обычно падает в разы, и дальше становится видно, с чем именно вы имеете дело.
Затем Turnstile или reCAPTCHA v3, в зависимости от того, что вам ближе. Оба варианта фоновые и почти не влияют на поведение живого посетителя. Turnstile проще в подключении и не требует аккаунта Google, reCAPTCHA привычнее и лучше документирована на русском.
Третьим слоем Akismet, если через формы приходят содержательные тексты и есть ручной спам. Здесь обязательно разметьте поля опциями akismet: и прогоните тестовое значение, иначе плагин будет активен, а защиты не будет.
И в качестве добивки список запрещённых значений в разделе «Обсуждение» для конкретных доменов и фраз, которые лезут именно к вам.
Что в этот набор не входит и почему. Арифметические вопросы вида «сколько будет два плюс три» автор Contact Form 7 упоминает как рабочий способ отсечь автоматические отправки, и против примитивных ботов они действительно помогают. Но это лишнее действие для клиента, и на форме заявки оно стоит конверсии дороже, чем экономит времени. Оставьте такой вопрос для форм, куда пишут редко: обратная связь в подвале, вакансии, форма для партнёров.
Если форму на сайте нужно не просто закрыть от спама, а связать с CRM и отчётностью, имеет смысл сразу заложить это в техническое задание. Мы занимаемся такими задачами в рамках разработки сайтов под ключ, и переделывать формы после запуска почти всегда дороже, чем собрать их правильно сразу.
Ошибки, из-за которых защита не работает
Самая частая ситуация в аудитах и самая обидная: плагин установлен, но не настроен. Akismet активен, лицензия введена, а поля формы не размечены опциями. Владелец сайта при этом уверен, что защита стоит.
Похожая по последствиям история, когда капча ломается после обновления темы или из-за кэша. Виджет перестал отображаться, форма продолжает отправляться, и никто этого не замечает. Проверять работоспособность защиты стоит хотя бы раз в квартал, а не только в день установки.
Отдельно стоит разобрать случай, когда заявки не доходят и это списывают на спам-фильтр. Часто причина в другом: письмо от сайта уходит с адреса, который не проходит проверку почтового сервера получателя, и попадает в спам уже там. Это проблема доставляемости, и капчей она не решается. Если сомневаетесь, что именно происходит, посмотрите нашу статью про плагины форм на WordPress, там разобрана в том числе судьба письма после отправки.
Обратная крайность встречается не реже: слишком много барьеров сразу. Капча плюс арифметический вопрос плюс обязательная галочка согласия плюс подтверждение по электронной почте. Каждый элемент по отдельности выглядит разумно, вместе они дают форму, которую заполняют единицы. Мерить в этом случае надо количество живых заявок, а не количество отсечённого спама.
И банальное, но регулярное: старая версия плагина. Актуальный Contact Form 7 требует WordPress 6.7 или выше и PHP 7.4 или выше. Turnstile появился только в ветке 6.1, так что на сайте, где плагин не обновляли пару лет, этой возможности просто нет.
Как понять, что защита действительно работает
Первое, на что смотреть, это количество отправок формы за неделю до и после настройки. Если поток упал в десять раз, а звонков столько же, вы отсекли мусор. Если упало и то и другое, вы отсекли клиентов.
Второе, доля отправок, помеченных как спам, в самом плагине. Contact Form 7 показывает причину, по которой сообщение было отклонено, и по этой статистике видно, какой из механизмов реально срабатывает, а какой стоит для вида.
Третье, количество лидов в CRM с пустыми или бессмысленными полями. Это конечная метрика, ради которой всё и делается, потому что именно она определяет, можно ли доверять отчётам по конверсии.
Раз в квартал имеет смысл отправить через форму тестовую заявку с реальными данными и убедиться, что она дошла до почты и до CRM. Занимает пять минут, а обнаруживает поломки, которые иначе всплывают через месяц молчания в отделе продаж. Настроить формы WordPress без спама один раз и забыть не получится: боты меняются, плагины обновляются, и форма при этом остаётся основным каналом, через который в компанию приходят обращения.
Частые вопросы
Какая защита от спама самая эффективная для форм на WordPress?
Одной универсальной нет. Honeypot отсекает простых ботов, Turnstile или reCAPTCHA v3 закрывают автоматические отправки, Akismet работает по содержимому и справляется в том числе с ручным спамом. Рабочий результат даёт комбинация двух-трёх механизмов.
Нужно ли переводить сайт на Cloudflare, чтобы поставить Turnstile?
Нет. Turnstile встраивается в любой сайт без пропускания трафика через Cloudflare, менять DNS или переносить домен не требуется. Нужны только site key и secret key из панели Cloudflare.
Почему Akismet стоит, а спам всё равно приходит?
Скорее всего, поля формы не размечены. Contact Form 7 требует указать опции у тегов формы: akismet:author для имени, akismet:author_email для почты, akismet:author_url для сайта. Без них плагин не передаёт данные в сервис.
Как проверить, что Akismet действительно фильтрует?
Отправьте форму, указав в поле имени значение «viagra-test-123» или в поле почты адрес «akismet-guaranteed-spam@example.com». Эти значения гарантированно возвращают ответ «спам». Если отправка прошла как обычная, разметка не работает.
Что такое score у reCAPTCHA v3 и какой порог ставить?
Score, это оценка от 0.0 до 1.0, где выше значит вероятнее живой человек. Contact Form 7 по умолчанию использует порог 0.50, Google советует начать с 0.5 и подстроить по своему трафику.
Где в WordPress список запрещённых слов и чем он опасен?
В админке, в разделе «Настройки», далее «Обсуждение». Поле «Ключи запрещённых комментариев» удаляет совпадения сразу и без уведомления, поэтому вносить туда слишком общие слова не стоит: настоящее обращение исчезнет незаметно.
Мешает ли капча конверсии?
Фоновые механизмы вроде reCAPTCHA v3 и Turnstile в режимах non-interactive и invisible не требуют от посетителя действий и на конверсию почти не влияют. А вот арифметические вопросы и картинки со светофорами стоят заявок, поэтому их место на редко используемых формах, а не на главной кнопке обращения.
