WebGL fingerprint: как Turnstile и hCaptcha видят ваш прокси
Содержание
- Что такое WebGL fingerprint
- Как капчи используют WebGL
- Параметры, которые собирают
- Прокси и WebGL: почему ломается
- Проблема 1: GPU через RDP
- Проблема 2: WebGL в headless-браузерах
- Проблема 3: Несоответствие GPU и User-Agent
- Кейсы из реальной работы
- Кейс 1: VPS без GPU
- Кейс 2: Docker с Puppeteer
- Кейс 3: Разные User-Agent и GPU
- Как обходить WebGL-детект
- Вариант 1: Подмена через расширения
- Вариант 2: Прокси с реальным GPU
- Вариант 3: Сбор и подмена fingerprint
- Что Turnstile делает с данными
- Практические цифры
- Итог
WebGL — не для игр. Это инструмент идентификации. Cloudflare Turnstile и hCaptcha используют его жестче, чем капча с картинками.
Разберем механику. Без воды.
Что такое WebGL fingerprint
WebGL (Web Graphics Library) — API для рендеринга 3D-графики в браузере. Но fingerprint-скрипты не рисуют кубики. Они собирают данные о рендеринге.
Каждая видеокарта обрабатывает графику по-своему. Драйверы, версии OpenGL, модели GPU — все это оставляет цифровой след. Даже одинаковое железо может давать разные результаты из-за версий драйверов.
Turnstile и hCaptcha рендерят невидимые сцены за миллисекунды. Потом сравнивают результаты с эталоном. Совпало? Ок. Нет? Стоп-сигнал.
Как капчи используют WebGL
Процесс выглядит так:
1. Сайт загружает виджет Turnstile или hCaptcha
2. Виджет запускает невидимый WebGL-рендеринг
3. Собираются параметры: GPU, драйвер, версия WebGL, рендер-время
4. Данные отправляются на сервер
5. Сервер сравнивает с базой известных конфигураций
Если fingerprint отличается от эталонного для реального браузера — вы в зоне риска.
Параметры, которые собирают
| Параметр | Что показывает | Типичное значение для реального браузера |
|----------|----------------|------------------------------------------|
| GPU renderer | Модель видеокарты | "ANGLE (NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0)" |
| WebGL vendor | Производитель драйвера | "Google Inc. (NVIDIA)" |
| Version | Версия WebGL | "WebGL 2.0" |
| Shading language version | Версия GLSL | "WebGL GLSL ES 3.00" |
| Render time | Время рендеринга | 3-15ms |
| Max texture size | Максимальный размер текстуры | 16384 |
Turnstile особо смотрит на render time. Прокси добавляют задержку — время рендеринга выбивается из нормы.
Прокси и WebGL: почему ломается
Прокси работают на уровне сети. WebGL — на уровне браузера. Тут и начинаются грабли.
Проблема 1: GPU через RDP
Типичный сценарий — вы арендуете прокси на VPS без GPU. Подключаетесь через RDP или VNC. WebGL показывает рендерер типа "Microsoft Basic Render Driver" или "ANGLE (Microsoft Basic Render Driver)".
Реальные браузеры так не выглядят. Turnstile блочит сразу.
Проблема 2: WebGL в headless-браузерах
Puppeteer, Playwright, Selenium — все они запускаются в headless-режиме. WebGL в headless Chrome часто отдает "SwiftShader" — программный рендерер.
```
GPU renderer: SwiftShader Device (Subzero)
```
hCaptcha видит это и ставит флаг. Headless-браузеры без GPU — красная тряпка для капчи.
Проблема 3: Несоответствие GPU и User-Agent
Вы сидите на Windows с Chrome 120. User-Agent показывает "Windows NT 10.0; Win64; x64". Но WebGL выдает "Mesa DRI Intel HD Graphics 620 (Kaby Lake GT2)" — типичный Linux-рендерер.
Несостыковка. Turnstile считает это аномалией.
Кейсы из реальной работы
Кейс 1: VPS без GPU
Проблема: арендовали прокси на Hetzner CX22 за 4 евро. GPU нет. WebGL в браузере показывает "Google SwiftShader".
Turnstile на сайте Cloudflare — бесконечная загрузка. hCaptcha — капча каждый раз, даже при правильном решении.
Решение: перешли на прокси с GPU-рендерингом. lexic.ml использует серверы с NVIDIA T4 — WebGL выдает нормальные значения. Turnstile перестал блокировать.
Кейс 2: Docker с Puppeteer
Запустили парсер на Node.js в Docker. WebGL отключен по умолчанию. Puppeteer запускает Chrome с флагом `--disable-gpu`.
hCaptcha видит отсутствие GPU-рендеринга. Код возвращает ошибку "Captcha verification failed".
Решение: пришлось включать программный рендеринг через `--use-gl=swiftshader` и подменять fingerprint через скрипты. Работает, но нестабильно.
Кейс 3: Разные User-Agent и GPU
Пользователь на прокси с Windows 11. User-Agent подменен на macOS. WebGL показывает "ANGLE (Intel(R) UHD Graphics 620)".
Turnstile видит: ОС — macOS, GPU — Intel UHD. На MacBook с Intel такое бывает. Но render time — 45ms. Для macOS это много. Капча срабатывает.
Причина: прокси добавляет 30ms задержки. Плюс рендеринг через RDP — еще 15ms.
Как обходить WebGL-детект
Вариант 1: Подмена через расширения
Расширения вроде CanvasBlocker или WebGL Fingerprint Defender подменяют данные WebGL. Но Turnstile обновляется — старые методы перестают работать.
Chrome Extension API не дает полного контроля над WebGL. Расширения могут подменить только часть данных.
Вариант 2: Прокси с реальным GPU
Единственный надежный способ. Вы арендуете прокси, где WebGL проходит через реальную видеокарту. Не SwiftShader, не Microsoft Basic Render.
На lexic.ml используют NVIDIA T4 с драйверами 535+. WebGL показывает нормальные значения:
```
GPU renderer: ANGLE (NVIDIA Tesla T4 Direct3D11 vs_5_0 ps_5_0)
```
Render time — 5-8ms. User-Agent соответствует Windows.
Вариант 3: Сбор и подмена fingerprint
Можно собрать fingerprint реального браузера и подменять через CDP (Chrome DevTools Protocol). Но это сложно:
```javascript
const { CDPSession } = await page.target().createCDPSession();
await session.send('Page.addScriptToEvaluateOnNewDocument', {
source: `
const getParameter = WebGLRenderingContext.prototype.getParameter;
WebGLRenderingContext.prototype.getParameter = function(p) {
if (p === 37445) return 'Intel Inc.';
if (p === 37446) return 'Intel Iris OpenGL Engine';
return getParameter.call(this, p);
};
`
});
```
Работает, но Turnstile может проверять не только getParameter, но и рендеринг сцены. Тогда подмена не спасет.
Что Turnstile делает с данными
Turnstile не просто собирает fingerprint. Он строит поведенческую модель:
- Время рендеринга
- Последовательность вызовов WebGL API
- Ошибки рендеринга (реальные браузеры их генерируют)
- Версии расширений WebGL
Если модель отклоняется от нормы — капча. Если сильно отклоняется — блокировка без капчи.
hCaptcha работает похоже, но добавляет проверку Canvas fingerprint и AudioContext. Три fingerprint в одном флаконе.
Практические цифры
| Метрика | Реальный браузер | Прокси без GPU | Прокси с GPU |
|---------|------------------|----------------|--------------|
| Render time | 3-12ms | 30-100ms | 5-15ms |
| GPU renderer | Название GPU | SwiftShader | Реальное GPU |
| WebGL vendor | Производитель | Google Inc. | Производитель |
| Проход Turnstile | 95% | 10% | 85% |
| Проход hCaptcha | 90% | 5% | 80% |
Цифры усредненные. Зависят от региона, провайдера, версии браузера.
Итог
WebGL fingerprint — не панацея. Но для прокси это серьезный барьер. Turnstile и hCaptcha используют его как один из сигналов в своей модели.
Без GPU на прокси — будете получать капчу постоянно. С программным рендерингом — тоже не вариант, Turnstile видит SwiftShader.
Единственный рабочий метод — прокси с реальной видеокартой и правильными драйверами. Остальное — костыли, которые перестают работать после очередного обновления Turnstile.