Loading...

Безопасность · 9 мин чтения

Что такое капча: как она работает, чего стоит и что её заменяет

Капча (CAPTCHA) — это тест, которым сайт отличает людей от автоматических программ: искажённые буквы, сетка картинок, галочка «Я не робот» или невидимая проверка, которая оценивает браузер. Она останавливает простых ботов, но отнимает время у живых посетителей; JS challenge, ограничение частоты запросов и оценки ботов делают ту же работу без головоломок.

Обновлено

Что такое капча: как она работает, чего стоит и что её заменяет

Как работает капча

CAPTCHA расшифровывается как «полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей». Название придумали в 2003 году исследователи из Университета Карнеги — Меллона, и с тех пор идея не изменилась: спросить то, что легко человеку и трудно программе, и принять запрос, только если ответ верен.

Любая капча — от кривого слова до невидимой проверки — работает в три шага. Виджет выполняется в браузере посетителя и выдаёт токен — доказательство того, что проверка пройдена. Браузер отправляет этот токен вместе с формой. А ваш сервер, прежде чем создать аккаунт или отправить сообщение, спрашивает у поставщика капчи, настоящий ли это токен.

Пропускают обычно именно третий шаг, и без него виджет — просто украшение: бот отправляет форму без токена или со старым и проходит. Поэтому токены живут недолго и одноразовы: проверять их нужно на сервере, при каждой отправке.

Проверка на сервере: шаг, который придаёт виджету смысл

curl -s https://www.google.com/recaptcha/api/siteverify \
  -d secret="$RECAPTCHA_SECRET" \
  -d response="$TOKEN_FROM_THE_FORM"

# {"success": true, "hostname": "example.com", ...}
# hCaptcha и Turnstile работают так же, у каждого свой адрес siteverify.

Виды: от кривых букв до проверки без головоломки

Текстовые капчи показывают искажённые буквы и цифры. Это первое поколение и сегодня самое слабое: программы распознавания символов читают их лучше многих людей.

Капчи с картинками просят отметить все квадраты со светофором или велосипедом. Звуковые капчи диктуют цифры на фоне шума и существуют в основном как доступная альтернатива первым двум.

reCAPTCHA v2 — галочка Google — изменила модель в 2014 году. Отметка «Я не робот» — это в основном момент, когда скрипт смотрит на браузер и на то, как он себя вёл; сетку картинок получает только тот посетитель, в котором скрипт не уверен. Невидимый вариант убирает и галочку, показывая сетку лишь при необходимости.

reCAPTCHA v3 (2018) не показывает ничего. Для каждого действия она возвращает оценку от 0.0 до 1.0, а что означает низкая оценка, решает ваш сервер: отказать, запросить второй фактор или отправить данные на модерацию.

hCaptcha следует модели v2 — фоновые проверки и задание с картинками при сомнении — и делает ставку на конфиденциальность; корпоративная версия добавляет оценки риска.

Cloudflare Turnstile (2022) заменяет головоломку меняющимся набором неинтерактивных проверок в браузере и бесплатен для любого сайта, а не только для сайтов за Cloudflare. У его виджета три режима: управляемый (галочка, только если проверки сомневаются), неинтерактивный и невидимый.

Направление видно по списку: каждое поколение спрашивает меньше у посетителя и больше у браузера.

Чего вам стоит капча

Время и конверсии за ним. Большое исследование Стэнфорда 2010 года намерило около 10 секунд на решение капчи с картинками и почти 30 секунд на звуковую, причём звуковые ответы часто оказывались неверными. Каждая из этих секунд стоит между посетителем и тем, ради чего он пришёл: зарегистрироваться, заплатить, задать вам вопрос.

Доступность. Визуальная головоломка отсекает незрячих и слабовидящих посетителей, а звуковая альтернатива трудна для всех и бесполезна для того, кто плохо и видит, и слышит. W3C опубликовал отдельную записку, целиком посвящённую недоступности капчи, а WCAG требует, чтобы у капчи была альтернатива для другого органа чувств.

Приватность и вес страницы. Виджет — это скрипт поставщика, загруженный на вашу страницу и видящий браузер посетителя; это должно быть отражено в вашей политике конфиденциальности. Кроме того, это немалый кусок стороннего JavaScript, поэтому загружайте его только на странице с формой, а не на всём сайте.

Ошибки в отношении людей. Системы, основанные на оценке риска, учатся тому, как выглядит типичный трафик, а пользователи VPN, браузеров с упором на приватность или загруженной офисной сети выглядят менее типично. Они получают больше головоломок или более низкую оценку, ничего плохого не сделав.

Почему головоломок стало недостаточно

Капча работает, только пока человеку решить её дешевле, чем машине. Это давно уже не так.

Машины стали лучше. Текстовые капчи первыми сдались распознаванию символов, сетки картинок позже — современным моделям компьютерного зрения. Исследование, представленное на USENIX Security в 2023 году, показало, что боты решают несколько распространённых видов капчи быстрее людей, а искажённый текст ещё и точнее.

Люди стали дешевле. Там, где не справляется программа, сервисы решения капчи передают головоломку живым исполнителям и возвращают ответ через API — за несколько долларов за тысячу решений. Для спамера это копейки; для ваших реальных посетителей головоломка остаётся всё той же десятисекундной помехой.

Поэтому сегодня капча отсеивает в основном дешёвую автоматизацию — скрипты, которые даже не пытаются выглядеть как браузер. На входе в форму это по-прежнему стоит делать. Но защитой для остального сайта это не является, и ценность современных систем — в сигналах, которые они собирают, а не в головоломке, которую они изредка показывают.

Невидимые альтернативы

Вот проверки, которые заменяют головоломку. Ни одна ничего не спрашивает у посетителя, и вместе они сильнее всего.

JS challenge (проверка JavaScript). На первый подозрительный запрос сервер отвечает маленькой страницей, которая выполняет скрипт в браузере. Настоящий браузер справляется примерно за секунду и получает подписанный cookie; скрипт, который только скачивает HTML, дальше не пройдёт. Посетитель видит короткую страницу «проверяем ваше соединение» или вообще ничего.

Proof of work (доказательство работы). Вариант, при котором браузер решает небольшую вычислительную задачу. Люди этого не замечают, но каждый запрос обходится боту в процессорное время, и в масштабе это ощутимо.

Ограничение частоты запросов. Считает запросы каждого клиента во времени. Человек читает страницу и делает несколько кликов в минуту; скрейпер — сотни запросов. Подсчёт выявляет поведение, которое не видно по одному запросу.

Оценки ботов и сигналы риска. Откуда пришёл запрос (домашнее подключение или сеть дата-центра), соответствуют ли его заголовки браузеру, которым он представляется, как он ведёт себя от запроса к запросу. Одни системы сводят всё это в одну оценку, другие действуют по конкретным сигналам. В обоих случаях решение принимается до того, как страница отдана.

Поля-ловушки (honeypot). Поле формы, скрытое от людей с помощью CSS. Люди оставляют его пустым; наивные боты заполняют все поля и выдают себя. Бесплатно, незаметно и эффективно против дешёвого спама.

Проверенные поисковые роботы. Поисковики должны проходить всё перечисленное без помех. Их узнают по сети, из которой они приходят, а не по строке user agent, которую может написать кто угодно.

Где капча по-прежнему уместна

На форме, где одна успешная отправка что-то даёт атакующему: регистрация, сброс пароля, формы обратной связи и комментариев, поля подарочных карт и промокодов. Там лишний шаг для человека — разумная цена, а токен, проверенный на сервере, — именно то, что нужно.

Так мы используем её и сами. На формах регистрации и обратной связи cdn.com.tr стоит капча с галочкой, а на странице тарифов скрипт капчи загружается только при открытии формы для корпоративных клиентов, так что тот, кто просто смотрит цены, его не скачивает.

Где она неуместна: обычный просмотр страниц, каталоги товаров, статьи, API и мобильные приложения. Головоломка перед просмотром взимает плату с каждого посетителя, чтобы остановить трафик, который невидимая проверка на edge останавливает лучше.

Как CDN.com.tr защищает сайт без головоломок

Защита от ботов в cdn.com.tr — это проверка JavaScript, которая работает на edge, перед вашим origin-сервером. В панели это карточка Защита от ботов (JS Challenge) в разделе Protection с тремя режимами: выключено, рискованные посетители (рекомендуется) и все. Смена режима доходит до edge сама; ничего развёртывать не нужно.

В режиме «рискованные посетители» проверяются только запросы с признаком риска: трафик из сетей дата-центров и облаков, откуда реальные читатели почти не заходят; клиент, который называет себя поисковым роботом, но приходит из сети, которой этот поисковик не пользуется; отсутствующий или почти пустой user agent; всплеск просмотров страниц с одного адреса. Читатель с домашнего или мобильного подключения ничего не видит.

Проверяются только переходы на страницы. Изображения, таблицы стилей, скрипты, вызовы API и отправка форм проходят нетронутыми, поэтому доля попаданий в кеш и ваши приложения не страдают. Проверенные роботы поисковых систем (Google, Bing, Yandex, Apple и DuckDuckGo) проходят всегда — их сверяют с сетью, из которой они действительно приходят, а не с именем, которое они сообщают. Индексация из-за проверки не страдает.

Проверяемый посетитель примерно секунду видит короткую страницу «Проверяем ваше соединение» на своём языке (встроено семь языков, для остальных — английский), а затем открывается нужная ему страница. Страница проверки отдаётся как 503 с noindex, поэтому никогда не попадает в поисковую выдачу. Прошедшего проверку посетителя 30 минут не проверяют повторно, а cookie допуска привязан к его адресу и браузеру — скопировать его на другую машину нельзя.

Режим «все» пропускает через проверку первый просмотр страницы каждого нового посетителя. Это рычаг на время атаки, а не настройка для обычных дней, и перед включением панель просит подтверждения.

Что она остановила и что стоит за ней

Это потолок любой проверки JavaScript: бот, управляющий настоящим браузером, может выполнить скрипт. Поэтому проверка — лишь один из нескольких слоёв на том же edge. Ограничение частоты запросов, заданное для всего аккаунта или для отдельного правила доставки и считаемое по адресу клиента, отвечает кодом 429 на всё, что превышает лимит, — именно это делает флот headless-браузеров дорогим. WAF проверяет содержимое запросов, а правила по стране и ASN закрывают кодом 403 сеть, от которой вы не хотите получать ничего.

Карточка проверки ведёт собственную статистику: показанные проверки, пройденные проверки, пропущенные проверенные роботы, причины проверок и сети, которые проверялись чаще всего, — за последний час, день, неделю или месяц. Доля прохождений около нуля — это нужный результат: значит, остановлены были не люди.

Какой инструмент для какой задачи

Страницы скрейпят или заваливают клиенты, похожие на браузеры: защита от ботов в режиме «рискованные посетители».

Идёт атака: режим «все» на время атаки, затем обратно к рискованным посетителям.

Подбор паролей на странице входа: строгое ограничение частоты запросов на этом пути и капча в форме.

Спам-регистрации и спам через форму обратной связи: капча или Turnstile в форме с проверкой на сервере плюс поле-ловушка.

Трафик из сети, которую вы никогда не обслуживаете: правило по ASN или по стране.

Вредоносное содержимое вроде SQL-инъекций: WAF. Проверка выясняет, кто спрашивает, а не что он отправляет. Для объёмных атак см. материал о защите от DDoS.

Частые вопросы

Как расшифровывается CAPTCHA?

Completely Automated Public Turing test to tell Computers and Humans Apart — полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей. Термин появился в 2003 году в Университете Карнеги — Меллона. «Тест Тьюринга» отсылает к тесту Алана Тьюринга, способна ли машина сойти за человека, только наоборот: здесь судья — машина.

Остаётся ли reCAPTCHA v3 капчей, если она ничего не показывает?

Это тот же сервис с другими условиями. v3 никогда не показывает головоломку; для каждого действия она возвращает оценку от 0.0 (скорее бот) до 1.0 (скорее человек), а что с ней делать, решает ваш сервер. Поэтому это скорее оценка ботов, чем тест, и главная работа — выбрать пороги и действия ниже них — остаётся за вами.

Могут ли боты решать капчу?

Да. Модели распознавания изображений решают текстовые и графические головоломки, а сервисы решения капчи отдают остальное платным живым исполнителям по несколько долларов за тысячу. Капча всё ещё отсеивает дешёвую автоматизацию, из которой состоит большая часть спама, но единственной защитой она быть не должна.

Cloudflare Turnstile работает только для сайтов на Cloudflare?

Нет. Turnstile — это виджет плюс серверный вызов проверки, и он работает на любом сайте, в том числе отдаваемом через другой CDN. Как и любая капча, он защищает, только если ваш сервер проверяет токен при каждой отправке.

Вредят ли капча и проверки ботов SEO?

Капча в форме — нет: поисковые роботы формы не отправляют. Проверка перед страницами навредила бы, если бы останавливала роботов. Поэтому проверка cdn.com.tr пропускает проверенных роботов Google, Bing, Yandex, Apple и DuckDuckGo, а свою страницу проверки отдаёт как 503 с noindex — она никогда не индексируется.

Если включить защиту от ботов, нужна ли ещё капча?

На формах, которые хотят отправлять атакующие, — да. Проверка решает, кто может загружать ваши страницы; на отправку форм она не смотрит. Формы регистрации, входа и обратной связи сохраняют свою капчу, а ограничение частоты запросов на этих путях ограничивает скорость попыток.

Что видит проверяемый посетитель?

Короткую страницу «Проверяем ваше соединение» на своём языке примерно на секунду, после чего нужная страница открывается сама. В браузере должен быть включён JavaScript. После прохождения проверки посетителя 30 минут не проверяют повторно.