Захист від спам-ботів
Спам приходить на сайт не від людей, а від скриптів, які за секунду перебирають тисячі форм в інтернеті. Їх не зупиняють ввічливі прохання і капча-заглушки без перевірки на сервері — тільки конкретні технічні бар'єри, які ви контролюєте самі.
Google reCAPTCHA
Найпоширеніший спосіб. reCAPTCHA v2 показує користувачу чекбокс «Я не робот» або набір картинок, v3 працює невидимо і присвоює кожному запиту число від 0 до 1 — ймовірність, що перед вами людина. Поріг відсікання ви задаєте самі, зазвичай 0.5.
Перевірка на сервері
Віджет на сторінці — це лише половина захисту. Токен, який він надсилає, потрібно передати на сервер і перевірити запитом до API Google, інакше форму пройде будь-який бот, який скопіює чужий валідний токен із вихідного коду сторінки.
curl -X POST https://www.google.com/recaptcha/api/siteverify \
-d secret=ВАШ_СЕКРЕТНИЙ_КЛЮЧ \
-d response=ТОКЕН_ІЗ_ФОРМИ
# Відповідь при неправильному секретному ключі:
{"success": false, "error-codes": ["invalid-input-secret"]}
# Відповідь при протермінованому або повторно використаному токені:
{"success": false, "error-codes": ["timeout-or-duplicate"]}
invalid-input-secret означає, що секретний ключ у запиті не збігається з ключем сайту в консолі Google — часто плутають ключ тесту та продакшна. timeout-or-duplicate — токен вже був використаний або застарів (живе близько двох хвилин), це нормально при повторній відправці форми після помилки валідації.
Підключаючи reCAPTCHA, ви передаєте дані відвідувача (IP-адресу, поведінку на сторінці) сервісу Google — це потрібно вказати в політиці конфіденційності сайту, інакше порушується вимога про прозорість обробки даних третіми сторонами. Cloudflare Turnstile передає менше даних і часто працює зовсім без візуальної перевірки, що робить його приватнішою альтернативою для сайтів, орієнтованих на Євросоюз.
Honeypot-поле
Додайте приховане поле у форму — боти його заповнюють, люди ні:
<input type="text" name="website" style="position:absolute;left:-9999px" tabindex="-1" autocomplete="off" aria-hidden="true">
На сервері просто перевіряєте: якщо поле website не порожнє — це бот, відкидайте запит без помилки (боту не потрібно знати, що його вирахували).
Типові помилки налаштування
Перевірка лише в браузері
Якщо код на JavaScript просто ховає кнопку відправки, поки капча не пройдена, а сервер токен не перевіряє — це захист від чесних користувачів, а не від ботів. Бот надсилає POST-запит напряму, минаючи браузер і вашу JS-перевірку цілком.
display:none замість зсуву за екран
<!-- Частина автозаповнювачів браузера ігнорує display:none і все одно
підставляє туди збережений email користувача -->
<input type="text" name="email2" style="display:none">
<!-- Зсув за межі екрана надійніший для тих самих цілей -->
<input type="text" name="email2" style="position:absolute;left:-9999px">
Порівняння методів захисту
| Метод | Потрібен JavaScript | Видимий користувачу | Передає дані третій стороні |
|---|---|---|---|
| reCAPTCHA v2 | Так | Так, чекбокс або картинки | Так, Google |
| reCAPTCHA v3 | Так | Ні | Так, Google |
| Cloudflare Turnstile | Так | Зазвичай ні | Так, Cloudflare |
| Honeypot-поле | Ні | Ні | Ні |
Honeypot нічого не надсилає назовні і не потребує згоди на обробку даних третьою стороною, але справляється лише з примітивними ботами, які заповнюють усі поля підряд. Проти цільового спаму на конкретний сайт його комбінують із reCAPTCHA або Turnstile.
Коли антиспам-заходи не врятують
- Ручний спам, який залишають живі люди за невелику плату — жодна капча не відрізнить таку людину від звичайного відвідувача.
- Атака через API сайту в обхід HTML-форми: якщо endpoint приймає ті самі поля напряму, honeypot і віджет капчі на сторінці марні — перевірка потрібна і на самому API.
- Застаріла версія плагіна антиспаму з відомою вразливістю обходу — регулярні оновлення обов'язкові, сама по собі капча не патчить дірки в коді.
Ще один чесний момент: будь-яка видима капча знижує конверсію форми — частина живих відвідувачів іде, не розібравшись із картинками або не дочекавшись завантаження віджета на повільному з'єднанні. Невидима reCAPTCHA v3 і honeypot цієї проблеми майже не створюють саме тому, що не вимагають дій від людини.
Для WordPress
- Akismet — захист коментарів, навчається на базі мільйонів сайтів
- WPForms з reCAPTCHA — захист форм зворотного зв'язку
- Cloudflare — захист на рівні DNS/CDN до того, як запит дійде до WordPress
Перевірка, що захист працює
- Надішліть форму без заповнення honeypot-поля — вона має пройти як зазвичай.
- Заповніть honeypot вручну через консоль розробника браузера і надішліть форму — вона має бути відхилена.
- Перевірте лог сервера на відповіді
invalid-input-secretіtimeout-or-duplicateвід Google — їхня відсутність не означає, що перевірка працює, переконайтесь, що код дійсно робить запит доsiteverify, а не лише звіряє наявність токена. - Через тиждень порівняйте кількість заявок у базі з кількістю заповнень форми в аналітиці — різкий розрив вкаже, що бот все ще проходить.
Детальніше про захист WordPress від зламу — у статті жорсткий захист WordPress, а про фільтрацію шкідливого трафіку на рівні веб-сервера — у розборі ModSecurity WAF.