Если форма просит решить «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 отдаёт текст за секунды. Несмотря на лёгкость обхода, капча остаётся массовой благодаря простоте внедрения и доступности для пользователей с ограничениями по зрению.