Що насправді захищає форму: CAPTCHA, поле-пастка, часова пастка, CSRF
Більшість контактних форм покладається на один прийом проти спаму, а багато таких прийомів зупиняють лише найпростіших ботів. Що зупиняє кожен шар захисту, чого він коштує та яке поєднання має сенс.
Спам через контактні форми рідко надходить від людини, яка вводить текст вручну. Переважно це програма, що знаходить форми, заповнює кожне поле й надсилає результат — тисячі разів. Є кілька засобів захисту, і вони працюють у дуже різних точках. Розуміння того, що кожен із них насправді робить, допомагає уникнути двох помилок: форми без справжнього захисту та форми, захищеної так суворо, що справжні люди здаються.
- Поле-пастка: прості боти, які заповнюють кожне поле
- Часова пастка: скрипти, які надсилають миттєво після завантаження
- CAPTCHA: більшість типової автоматизації
- Токен CSRF: запити, надіслані прямо на кінцеву точку
- Обмеження частоти: потоки з одного джерела
- Підтвердження роботи: дешеві масові надсилання, без відстеження чи головоломок
- Серверні перевірки: усе, що обходить браузер
- Цілеспрямовані боти його пропускають; якщо поле погано приховане, програми читання з екрана його оголошують
- Боти, які чекають; без серверного підпису її легко підробити
- Перешкода для всіх, бар’єри доступності, часто сторонній сервіс; існують сервіси розв’язування
- Боти, які спочатку завантажують сторінку, теж отримують дійсний токен
- Спам, розподілений між багатьма IP-адресами
- Наполегливий відправник з обчислювальними потужностями; потрібен JavaScript
- Самі по собі — не панацея; але без них кожен інший шар є декорацією
Поле-пастка та часова пастка: невидимі фільтри
Поле-пастка — це додаткове поле, якого люди ніколи не бачать, наприклад поле «website», приховане через CSS. Прості боти заповнюють усі поля, тож заповнена пастка сигналізує про автоматизацію й сервер може непомітно відкинути повідомлення. Боти, написані для Вашого сайту, або ті, що відтворюють сторінку як браузер, пропускають його. Приховуйте поле правильно: поле, лише переміщене за межі екрана, може оголошуватися програмами читання з екрана, отримувати фокус клавішею Tab або заповнюватися автозаповненням. Використовуйте aria-hidden, tabindex -1 та autocomplete off, а також нейтральний підпис із проханням залишити поле порожнім для тих, хто все ж потрапить на нього.
Часова пастка фіксує, коли форму було надано, і відхиляє надсилання, що надходять неправдоподібно швидко. Людям потрібно кілька секунд, щоб прочитати й набрати текст; багато скриптів надсилають за частку секунди. Часову позначку потрібно перевіряти на сервері та захищати від підроблення, наприклад підписом або зберіганням у сесії: звичайне приховане поле часу бот просто перепише. Установлюйте низький поріг, оскільки автозаповнення робить швидкими й справжніх людей. Боти, які просто чекають, проходять: часова пастка — це фільтр, а не стіна.
CAPTCHA: дієва, але не безкоштовна
CAPTCHA просить довести, що діє не бот: від завдань із зображеннями до перевірок у фоновому режимі; серед поширених сервісів — reCAPTCHA, hCaptcha, Cloudflare Turnstile і Friendly Captcha. Вона зупиняє більшість типової автоматизації, тому й така популярна. Проте кожна видима головоломка є перешкодою, на якій частина відвідувачів здається, а більшість сервісів завантажує сторонній скрипт, що порушує питання конфіденційності та згоди. CAPTCHA також допомагає лише за правильного налаштування: загальнодоступний тестовий ключ сайту, віджет без скрипта чи токен, який сервер ніколи не перевіряє, виглядають як захист, але ним не є. Безкоштовна перевірка на formexposed.com вказує на такі помилки ззовні.
Доступність — частина цієї ціни. Завдання із зображеннями виключають незрячих і багатьох людей зі слабким зором, аудіоальтернативи не допомагають людям із порушеннями і слуху, і зору, а складні логічні завдання обтяжують людей із когнітивними порушеннями. Критерій успішності WCAG 2.2 1.1.1 вимагає текстової альтернативи, що описує мету CAPTCHA, та альтернативних форм для різних органів чуття. Фонові перевірки уникають більшості цих проблем, але за підозри запасним варіантом часто знову стає візуальна головоломка — перевірте цей шлях із клавіатурою та програмою читання з екрана.
Токен CSRF: захист від підроблення, а не від спаму
Токен CSRF — випадкове значення, яке сервер додає у форму й очікує отримати назад. Його створено проти міжсайтового підроблення запитів, коли інший сайт змушує браузер відвідувача надіслати запит, якого той не мав наміру надсилати. У публічній контактній формі він має побічний ефект: боти, які надсилають прямо на адресу форми без завантаження сторінки, відхиляються. Будь-який бот, який отримує сторінку й повертає токен, проходить. Більшість фреймворків і плагінів форм уже містить токени CSRF — залишайте їх увімкненими, але не вважайте захистом від спаму.
Що має відбуватися на сервері
- Повторно перевіряйте кожне поле на сервері: обов’язковість, довжину, формат електронної пошти та відсутність розривів рядків у полях, що потрапляють у заголовки листа.
- Перевіряйте токени CAPTCHA та підтвердження роботи під час кожного надсилання через сервіс, що їх видав, або у власному коді й відхиляйте повторно використані токени.
- Обмежуйте надсилання за IP-адресою та часовим вікном. Це зупиняє потоки з одного джерела; спам, розподілений між багатьма адресами, потребує інших шарів.
- Розгляньте підтвердження роботи: перед надсиланням браузер розв’язує невелику обчислювальну задачу. Відвідувачі не бачать головоломки й нічого не відстежується, але масове надсилання стає дорогим.
Доцільне поєднання: два або три шари
- 1Почніть із невидимих шарів: доступного поля-пастки та підписаної часової пастки, обидва перевіряються на сервері.
- 2Додайте обмеження частоти за IP-адресою, щоб одне джерело не могло засипати форму надсиланнями.
- 3Якщо цілеспрямований спам усе ще проходить, додайте підтвердження роботи або CAPTCHA — бажано без видимої головоломки та з доступною альтернативою.
- 4Залиште токен CSRF, який надає Ваш фреймворк, — як доповнення, а не як захист.
- 5Перевірте результат як відвідувач — лише з клавіатурою, із програмою читання з екрана, на телефоні — і переконайтеся, що справжні повідомлення досі надходять.
На багатьох сайтах поле-пастка, часова пастка й обмеження частоти разом уже прибирають більшість типового спаму без жодної видимої перешкоди; CAPTCHA залишається резервом, коли цього недостатньо. На WordPress безкоштовний плагін formexposed поєднує поле-пастку, перевірку часу та підтвердження роботи без потреби в Google. Щоб побачити, що Ваша форма показує ззовні, — які шари наявні, чи дієво налаштована CAPTCHA, — безкоштовній перевірці на formexposed.com потрібен лише домен, без облікового запису. Вона не бачить Вашого серверного коду, тож серверна частина залишається Вашим завданням.