Не размещайте API-ключ CAPTCHA в браузерном JavaScript

Автор: solvethree4 мин на чтение

Храните API-ключ рабочего пространства solvethree на сервере. Браузер управляет формой и сеансом приложения; бэкенд с проверкой подлинности отвечает за создание и получение задач. Не заменяйте утекший браузерный ключ неограниченным маршрутом бэкенда, через который любой желающий сможет расходовать баланс вашего рабочего пространства.

На этой странице

NEXT_PUBLIC — неподходящее место для ключа рабочего пространства

Ключ рабочего пространства используется для аутентификации запросов к solvethree через Authorization: Bearer. Размещая его в JavaScript браузера, в том числе через включенную в сборку публичную переменную окружения вроде NEXT_PUBLIC_SOLVETHREE_API_KEY, вы раскрываете эти учетные данные браузеру. Обфускация значения или его добавление только при прямом вызове fetch не делает его конфиденциальным.

Храните SOLVETHREE_API_KEY в конфигурации, доступной только серверу, и используйте его только в доверенном серверном коде. Браузер должен вызывать маршрут вашего приложения, а не API задач solvethree с ключом вашего рабочего пространства.

Храните входные данные задачи в серверной вспомогательной функции

Вспомогательный модуль только для сервера · храните учётные данные рабочего пространства здесь
// Import only from trusted server code. Your application authenticates the caller.
import { Solvethree } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
export async function createCaptchaForLogin(requestId) {
  return client.createTask({
    site: process.env.CAPTCHA_SITE,
    action: 'login',
    proxy: process.env.SOLVETHREE_PROXY,
    requestId,
  }, { waitMs: 0, signal: AbortSignal.timeout(20000) });
}
// The browser calls your authenticated application route, not the solver API.
// Save the returned task ID; retrieve that ID from server code with getTask.
// Submit a ready token using the proxy/browser identity attached to that solve.
// Merely moving the key server-side does not configure the browser's proxy.

Настройте SOLVETHREE_API_KEY, CAPTCHA_SITE и SOLVETHREE_PROXY на сервере. CAPTCHA_SITE — имя целевого хоста, а не полный URL. Вспомогательная функция фиксирует действие login и задает один прокси; браузер не выбирает ни один из этих параметров.

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

waitMs: 0 запрашивает создание задачи без ожидания завершения решения. Сохраните возвращенный ID задачи и получайте ее из серверного кода с помощью getTask. Сигнал отмены через 20 секунд ограничивает длительность этого запроса, но не гарантирует, что решение завершится за 20 секунд.

Предоставляйте операцию входа, а не произвольное решение CAPTCHA

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

Контракт запросов от браузера к бэкенду
Контракт запросов от браузера к бэкенду
ОперацияЧто отправляет браузерЧто делает бэкенд
Запуск решения для входаСеанс приложения и requestId для этой попытки входа.Аутентифицирует вызывающего клиента, проверяет попытку и лимиты создания, затем вызывает вспомогательную функцию с фиксированными параметрами. Сохраняет ID задачи с привязкой к этому клиенту и попытке; возвращает только ID задачи и статус, необходимые интерфейсу.
Получение прогрессаСеанс приложения и ID задачи, возвращенный для этой попытки.Перед получением задачи проверяет, что она принадлежит вызывающему клиенту. Возвращает прогресс, контролируемый ответ об ошибке или готовый результат, необходимый авторизованному клиенту, который выполняет отправку.

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

ID задачи не дает права доступа. Проверяйте принадлежность задачи при каждом запросе прогресса и не возвращайте учетные данные рабочего пространства или серверного прокси в ответах браузеру.

Восстановите существующую задачу перед созданием новой

  • Сохраняйте один requestId для логической попытки входа. Проверяйте его документированный формат: 1–64 ASCII-буквы, цифры, символы подчеркивания или дефисы. Привяжите его к попытке вызывающего клиента; он не является учетными данными для аутентификации.
  • Если время ожидания создания истекло, сохраните этот requestId и исходные входные данные задачи. Повтор того же запроса с тем же ID восстанавливает существующую задачу. Изменение входных данных при повторном использовании ID вызывает конфликт.
  • Обрабатывайте неуспешные HTTP-ответы, прежде чем интерпретировать данные успешного ответа. Для полученной задачи статусы pending и solving означают, что нужно продолжать опрос; ready означает, что решение доступно.

Получив ID задачи, запрашивайте эту задачу, а не запускайте новое решение при каждом обновлении страницы браузера или запросе прогресса. Для диагностики сбоев см. обработку ошибок API.

Определите, какой клиент будет отправлять токен

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

Если браузер не может выполнить отправку с этими настройками, передача ему одного токена не является полноценной интеграцией. Используйте отправляющий клиент, который можно согласованно настроить, не подмешивая идентификационные данные, прокси или целевой URL из другого сеанса. Готовая задача означает, что solvethree сгенерировал решение, а не что целевой сайт принял последующий запрос.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Не размещайте API-ключ CAPTCHA в браузерном JavaScript · solvethree