Какво наистина защитава формуляра: CAPTCHA, honeypot, времеви капан, CSRF
Повечето формуляри за контакт разчитат на един-единствен трик срещу спама, а много от тези трикове спират само най-простите ботове. Какво спира всеки защитен слой, каква е цената му и коя комбинация има смисъл.
Спамът чрез формуляри за контакт рядко идва от човек, който пише на ръка. Най-често това е софтуер, който намира формуляри, попълва всяко поле и изпраща резултата – хиляди пъти. Съществуват няколко защити и те действат в много различни точки. Ако знаете какво наистина прави всяка от тях, ще избегнете две грешки: формуляр без реална защита и формуляр, охраняван толкова строго, че истинските хора се отказват.
- Honeypot: прости ботове, които попълват всяко поле
- Времеви капан: скриптове, които изпращат веднага след зареждането
- CAPTCHA: повечето обща автоматизация
- CSRF токен: заявки, изпратени директно към крайната точка
- Ограничаване на честотата: потоци от един източник
- Proof-of-work: евтини масови изпращания, без проследяване или пъзели
- Проверки на сървъра: всичко, което заобикаля браузъра
- Целенасочените ботове го пропускат; ако е скрит лошо, екранните четци го обявяват
- Ботове, които изчакват; без подпис от сървъра лесно се фалшифицира
- Препятствие за всички, бариери пред достъпността, често от трета страна; съществуват услуги за решаване
- Ботовете, които първо зареждат страницата, също получават валиден токен
- Спам, разпределен между много IP адреси
- Решителен подател с изчислителна мощ; изисква JavaScript
- Нищо самостоятелно – но без тях всеки друг слой е само украса
Honeypot и времеви капан: невидими филтри
Honeypot е допълнително поле, което хората никога не виждат, например поле с име „website“, скрито с CSS. Простите ботове попълват всяко поле, така че попълненият honeypot сигнализира автоматизация и сървърът може безшумно да отхвърли съобщението. Ботовете, написани специално за вашия сайт, или тези, които визуализират страницата като браузър, го пропускат. Скрийте го правилно: поле, което просто е изместено извън екрана, може да бъде обявено от екранните четци, достигнато с клавиша Tab или попълнено от автоматичното попълване. Използвайте aria-hidden, tabindex -1 и autocomplete off, плюс неутрален етикет, който моли всеки попаднал там да го остави празно.
Времевият капан записва кога е доставен формулярът и отхвърля изпращания, които пристигат неправдоподобно бързо. Хората се нуждаят от няколко секунди, за да прочетат и напишат; много скриптове изпращат за част от секундата. Времевият печат трябва да се проверява на сървъра и да е защитен срещу манипулиране, например подписан или съхраняван в сесията – обикновено скрито поле с време просто се презаписва от бота. Дръжте прага нисък, тъй като автоматичното попълване прави и истинските хора бързи. Ботовете, които просто изчакват, преминават: времевият капан е филтър, а не стена.
CAPTCHA: ефективна, но не безплатна
CAPTCHA изисква доказателство, че не работи бот – от пъзели с изображения до проверки, които се извършват във фонов режим; разпространени услуги са reCAPTCHA, hCaptcha, Cloudflare Turnstile и Friendly Captcha. Тя спира повечето обща автоматизация, затова е толкова популярна. Но всеки видим пъзел е препятствие, пред което част от посетителите се отказват, а повечето услуги зареждат скрипт от трета страна, което повдига въпроси за поверителността и съгласието. CAPTCHA помага и само ако е настроена правилно: публичен тестов ключ на сайта, уиджет без скрипта му или токен, който сървърът никога не проверява, изглеждат като защита, но не са. Безплатна проверка на formexposed.com посочва такива грешки отвън.
Достъпността е част от тази цена. Пъзелите с изображения изключват незрящите и много хора със слабо зрение, аудио алтернативите не помагат на сляпо-глухите, а сложните логически задачи натоварват хората с когнитивни затруднения. Критерий за успех 1.1.1 на WCAG 2.2 изисква текстова алтернатива, описваща предназначението на CAPTCHA, и алтернативни форми за различните сетива. Фоновите проверки избягват повечето от това, но когато станат подозрителни, резервният вариант често отново е визуален пъзел – тествайте този път с клавиатура и екранен четец.
CSRF токен: защита срещу фалшифициране, а не срещу спам
CSRF токенът е случайна стойност, която сървърът поставя във формуляра и очаква да получи обратно. Той е създаден срещу фалшифициране на заявки между сайтове, при което друг уебсайт кара браузъра на посетителя да изпрати заявка, която посетителят никога не е възнамерявал. При публичен формуляр за контакт той има страничен ефект: ботовете, които изпращат директно към адреса на формуляра, без да зареждат страницата, биват отхвърлени. Всеки бот, който извлича страницата и връща токена, преминава. Повечето фреймуърци и плъгини за формуляри така или иначе включват CSRF токени – оставете ги включени, но не ги броете за защита от спам.
Какво трябва да се случва на сървъра
- Валидирайте отново всяко поле на сървъра: задължителни полета, дължина, формат на имейла и липса на нови редове в полета, които попадат в заглавните редове на имейла.
- Проверявайте CAPTCHA и proof-of-work токените при всяко изпращане, чрез издаващата услуга или в собствения си код, и отхвърляйте повторно използвани токени.
- Ограничете изпращанията по IP адрес и времеви прозорец. Това спира потоците от един източник; за спам, разпределен между много адреси, са необходими други слоеве.
- Обмислете proof-of-work: преди изпращането браузърът решава малка изчислителна задача. Посетителите не виждат пъзел и нищо не се проследява, но масовото изпращане става скъпо.
Разумна комбинация: два или три слоя
- 1Започнете с невидимите слоеве: достъпен honeypot и подписан времеви капан, като и двата се проверяват на сървъра.
- 2Добавете ограничаване на честотата по IP адрес, за да не може един източник да залее формуляра.
- 3Ако целенасоченият спам все още преминава, добавете proof-of-work или CAPTCHA – за предпочитане без видим пъзел и с достъпна алтернатива.
- 4Запазете CSRF токена, който предоставя вашият фреймуърк – като бонус, а не като защита.
- 5Тествайте резултата като посетител – само с клавиатура, с екранен четец, на телефон – и проверете дали истинските съобщения все още пристигат.
На много сайтове honeypot, времеви капан и ограничаване на честотата заедно вече премахват по-голямата част от общия спам без никакво видимо препятствие; CAPTCHA е резервата за случаите, когато това не е достатъчно. За WordPress безплатният плъгин formexposed комбинира honeypot, проверка на времето и proof-of-work, без да е необходим Google. За да видите какво показва формулярът ви отвън – кои слоеве присъстват, дали CAPTCHA е настроена ефективно – за безплатна проверка на formexposed.com е нужен само домейн, без акаунт. Тя не може да види кода на сървъра ви, така че сървърната част остава ваша задача.