До основного вмісту

Захист сайту від спаму та ботів

Безпека · 15.03.2025 · 4 хв читання
Ілюстрація до статті «Захист сайту від спаму та ботів»

Захист від спам-ботів

Спам приходить на сайт не від людей, а від скриптів, які за секунду перебирають тисячі форм в інтернеті. Їх не зупиняють ввічливі прохання і капча-заглушки без перевірки на сервері — тільки конкретні технічні бар'єри, які ви контролюєте самі.

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

Перевірка, що захист працює

  1. Надішліть форму без заповнення honeypot-поля — вона має пройти як зазвичай.
  2. Заповніть honeypot вручну через консоль розробника браузера і надішліть форму — вона має бути відхилена.
  3. Перевірте лог сервера на відповіді invalid-input-secret і timeout-or-duplicate від Google — їхня відсутність не означає, що перевірка працює, переконайтесь, що код дійсно робить запит до siteverify, а не лише звіряє наявність токена.
  4. Через тиждень порівняйте кількість заявок у базі з кількістю заповнень форми в аналітиці — різкий розрив вкаже, що бот все ще проходить.

Детальніше про захист WordPress від зламу — у статті жорсткий захист WordPress, а про фільтрацію шкідливого трафіку на рівні веб-сервера — у розборі ModSecurity WAF.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці