Explainers

Объяснение математических и логических типов CAPTCHA

Если форма просит решить «7 + 3 = ?» или ответить, какого цвета трава, — это математическая или логическая CAPTCHA: самый слабый вид проверки, который до сих пор стоит на тысячах сайтов на WordPress. Компьютеру такой пример решить проще, чем человеку: текстовый вариант разбирает обычная регулярка, картиночный — OCR. Ниже — какие вариации встречаются, как они устроены и почему их до сих пор ставят, хотя от целенаправленного бота они не защищают.


Почему математическая CAPTCHA до сих пор встречается

Просто внедрить

Не нужен внешний API или JS SDK — хватает готового плагина или пары строк серверного кода.

Плагины WordPress

«Math CAPTCHA» и «Really Simple CAPTCHA» стоят на огромном числе сайтов и до сих пор поддерживаются разработчиками.

Минимум раздражения для пользователя

Сложить два числа в уме быстрее, чем искать на картинках автобусы или светофоры.

Доступность

Текстовый вариант нормально читают программы для незрячих — в отличие от капч с картинками.

Наследие legacy-систем

Старые формы и админ-панели, написанные до современных CAPTCHA-сервисов, остались с арифметической проверкой.


Виды математических и логических CAPTCHA

1. Простая арифметика

Обычная задача на сложение, вычитание или умножение. Вопрос либо выводится обычным текстом (легко разобрать регуляркой), либо встроен в картинку — тогда нужен OCR. Примеры:

  • «Сколько будет 3 + 5?»
  • «12 – 4 = ?»
  • «6 × 7 = ?»

2. Уравнение на картинке

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

  • Картинка с «14 + 23 = ?» искажённым шрифтом
  • Изображение с цветными цифрами на зашумлённом фоне

3. Числа прописью

Числа записаны словами, а не цифрами — нужен разбор естественного языка (NLP), чтобы превратить слова в числа, а затем вычисление. Примеры:

  • «Сколько будет семь плюс три?»
  • «Введите результат: двенадцать минус пять»

4. Логические вопросы на общие знания

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

  • «Какого цвета трава?»
  • «Сколько ног у собаки?»
  • «Огонь горячий или холодный?»

5. Числовые последовательности и паттерны

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

  • «Что дальше: 2, 4, 6, 8, ?»
  • «Продолжите ряд: 1, 1, 2, 3, 5, ?»

CAPTCHA с примером против других типов проверки

Параметр Математическая CAPTCHA reCAPTCHA v2 hCaptcha Слайдер-CAPTCHA
Трение для пользователя Низкое (быстрый счёт в уме) Среднее (выбор картинок) Среднее (выбор картинок) Низкое (одно перетаскивание)
Устойчивость к ботам Очень низкая Высокая Высокая Средняя
Доступность Хорошая (текстовые версии) Слабая (нужно зрение) Слабая (нужно зрение) Слабая (нужна моторика)
Стоимость Бесплатно (self-hosted) Есть бесплатный уровень Есть бесплатный уровень Зависит от провайдера
Где чаще встречается WordPress, формы обратной связи Вход, регистрация Вход, регистрация E-commerce, азиатские рынки

Из таблицы видно: как барьер против ботов CAPTCHA почти бесполезна, но по трению и доступности — одна из самых мягких, отсюда и живучесть.


Как математическая CAPTCHA устроена технически

Текстовый поток

Server generates random equation (e.g., "7 + 3")
    ↓
Stores answer (10) in server-side session
    ↓
Renders equation as HTML text or image
    ↓
User submits answer via form field
    ↓
Server compares submitted answer to stored answer
    ↓
Match → Form submitted     Mismatch → Error shown

Поток с картинкой

Server generates random equation
    ↓
Renders equation into a distorted image (noise, lines, color shifts)
    ↓
Image served to client via <img> tag
    ↓
User reads image, computes answer, types in form field
    ↓
Server validates submitted answer

Разница только в одном шаге: сервер либо отдаёт уравнение текстом, либо рендерит его в картинку — остальное (сессия и сравнение ответа) одинаково.


Как обнаружить математическую CAPTCHA в автоматизации

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

Обнаружение на Python

import requests
from bs4 import BeautifulSoup
import re

def detect_math_captcha(url):
    """Detect common math CAPTCHA patterns on a page."""
    response = requests.get(url, timeout=10)
    soup = BeautifulSoup(response.text, "html.parser")
    html = response.text.lower()

    indicators = {
        "text_math": False,
        "image_math": False,
        "logic_question": False,
    }

    # Check for text-based math questions
    math_patterns = [
        r"what is \d+\s*[\+\-\×\*]\s*\d+",
        r"\d+\s*[\+\-\×\*]\s*\d+\s*=\s*\?",
        r"solve:\s*\d+",
        r"type the (result|answer|sum)",
    ]
    for pattern in math_patterns:
        if re.search(pattern, html):
            indicators["text_math"] = True
            break

    # Check for CAPTCHA images near math-related labels
    captcha_images = soup.find_all("img", attrs={
        "alt": re.compile(r"captcha|math|verify", re.I)
    })
    if captcha_images:
        indicators["image_math"] = True

    # Check for logic questions
    logic_patterns = [
        r"what color is",
        r"how many legs",
        r"what comes next",
        r"is .+ hot or cold",
    ]
    for pattern in logic_patterns:
        if re.search(pattern, html):
            indicators["logic_question"] = True
            break

    return indicators

result = detect_math_captcha("https://example.com/contact")
print(result)

Обнаружение на Node.js

const axios = require("axios");
const cheerio = require("cheerio");

async function detectMathCaptcha(url) {
    const { data: html } = await axios.get(url, { timeout: 10000 });
    const $ = cheerio.load(html);
    const lower = html.toLowerCase();

    const indicators = {
        textMath: false,
        imageMath: false,
        logicQuestion: false,
    };

    // Text-based math patterns
    const mathPatterns = [
        /what is \d+\s*[+\-×*]\s*\d+/,
        /\d+\s*[+\-×*]\s*\d+\s*=\s*\?/,
        /solve:\s*\d+/,
        /type the (result|answer|sum)/,
    ];

    for (const pattern of mathPatterns) {
        if (pattern.test(lower)) {
            indicators.textMath = true;
            break;
        }
    }

    // Check for CAPTCHA images
    $("img").each((_, el) => {
        const alt = ($(el).attr("alt") || "").toLowerCase();
        if (/captcha|math|verify/.test(alt)) {
            indicators.imageMath = true;
        }
    });

    return indicators;
}

detectMathCaptcha("https://example.com/contact").then(console.log);

Оба скрипта ищут в HTML признаки текстового уравнения, картинку с подозрительным alt или формулировку логического вопроса — и возвращают, какой вариант сработал.


Решение картиночных уравнений через OCR

Если пример нарисован на картинке, регулярка по HTML не поможет — нужен OCR, который считает текст с изображения, а дальше простой парсер вычислит ответ.

CaptchaAI для математической CAPTCHA на картинке

import requests
import time
import re

API_KEY = "YOUR_API_KEY"
CAPTCHA_IMAGE_URL = "https://example.com/captcha.png"

# Download the CAPTCHA image
image_data = requests.get(CAPTCHA_IMAGE_URL).content

# Submit to CaptchaAI OCR
import base64
b64_image = base64.b64encode(image_data).decode()

submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "base64",
    "body": b64_image,
    "json": 1,
})

task_id = submit.json().get("request")

# Poll for result
for _ in range(30):
    time.sleep(3)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id,
        "json": 1,
    })
    data = result.json()
    if data.get("status") == 1:
        ocr_text = data["request"]  # e.g., "7 + 3"
        print(f"OCR result: {ocr_text}")

        # Parse and compute the answer
        match = re.match(r"(\d+)\s*([+\-*/×])\s*(\d+)", ocr_text)
        if match:
            a, op, b = int(match.group(1)), match.group(2), int(match.group(3))
            ops = {"+": a + b, "-": a - b, "*": a * b, "×": a * b, "/": a // b}
            answer = ops.get(op)
            print(f"Answer: {answer}")
        break
    elif "CAPCHA_NOT_READY" in str(data):
        continue

Эндпоинты in.php и res.php те же самые, что и для любых других картиночных задач в CaptchaAI — специального метода для арифметики нет, потому что задача сводится к обычному OCR-распознаванию текста на изображении.

Пример из практики. Команда, которая мониторит заявки интернет-магазина в СНГ, чаще всего встречает такую капчу на форме обратной связи WordPress — в личном кабинете там уже стоит Turnstile или reCAPTCHA. Если скрипт только читает публичную форму и не хранит персональные данные посетителей, юридических рисков нет; при логировании данных стоит свериться с 152-ФЗ «О персональных данных».


Часто задаваемые вопросы

Насколько математическая CAPTCHA защищает форму от ботов?

Практически никак. Текстовый вариант разбирается одной регуляркой, картиночный — обычным OCR. Против целенаправленного бота она не работает, но отсекает примитивный спам-трафик, который вообще не умеет разбирать HTML. Для серьёзной защиты нужна поведенческая проверка — reCAPTCHA v3 или Cloudflare Turnstile.

Как понять, что на странице стоит именно математическая CAPTCHA?

Ищите в HTML фразы вида «what is», «solve:», текст вопроса рядом с полем ввода, либо alt-атрибут картинки со словами captcha/math/verify. Скрипт из раздела про обнаружение выше ищет эти паттерны регуляркой и за один запрос отличает текстовый вариант от картиночного.

Что нужно, чтобы подключить OCR-решение через CaptchaAI, и сколько это стоит?

Через API нужен только API-ключ и картинка с уравнением — эндпоинты in.php и res.php одинаковые для всех типов изображений. CaptchaAI тарифицирует потоки, а не решения: плана BASIC ($15/мес, 5 потоков) хватает с запасом, а число решений внутри потока не ограничено.

Чем заменить математическую CAPTCHA, если нужна незаметная защита без раздражения пользователей?

Cloudflare Turnstile — вариант с низким трением: работает в фоне и почти не показывает задание. Для оценки риска по поведению добавьте reCAPTCHA v3 со скорингом.


Краткое содержание

Математическая и логическая CAPTCHA — самая простая и самая слабая проверка, которая до сих пор живёт в формах обратной связи на WordPress и в legacy-системах. Текстовый вариант разбирается прямо из HTML. Картиночный требует OCR, а дальше — обычная арифметика: API распознавания изображений CaptchaAI отдаёт текст за секунды. Несмотря на лёгкость обхода, капча остаётся массовой благодаря простоте внедрения и доступности для пользователей с ограничениями по зрению.

Похожие статьи

Комментарии для этой статьи отключены.