---
type: explanation
title: Инструментирование
summary: Как Caputchin проверяет, что испытание решил настоящий браузер, а не скрипт, притворяющийся им.
---

Proof of work доказывает, что *усилие* было потрачено. Он не доказывает, *что* его потратило. Упорный злоумышленник с фермой настоящих браузеров может дёшево перемалывать головоломки. Инструментирование это второй слой, который закрывает этот разрыв: оно доказывает, что работа произошла внутри подлинного браузера.

## Как это работает

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

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

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

## Content-Security-Policy

Поскольку программа запускает `eval` в браузере посетителя, страница, встраивающая твой виджет, должна разрешать `'unsafe-eval'` в своей Content-Security-Policy `script-src`. Для этого нет отката: если `'unsafe-eval'` заблокирован, программа не может запуститься, и проверка сбоит. Если твоя политика не может его разрешить, выключи инструментирование для ключа на его странице [Безопасность](/docs/site-keys/security), что снимает требование ценой выявления автоматизированных браузеров (proof of work и любая требуемая игра по-прежнему работают). Смотри [изоляцию игр в песочнице](/docs/understanding-caputchin/game-sandboxing#the-csp-you-set-on-your-own-page) для полной политики хост-страницы.

## Почему оно в паре с proof of work

Два слоя покрывают слепые зоны друг друга. Proof of work в одиночку можно дёшево намайнить настоящими браузерами; инструментирование в одиночку мог бы подделать скрипт, который никогда не делает работу. Вместе они поднимают цену по двум независимым осям: proof of work доказывает усилие, инструментирование доказывает окружение.

## Обфускация

Поскольку программа поставляется посетителю, мотивированный злоумышленник мог бы изучить её и попробовать предвычислить ответы. Чтобы сделать это труднее, программа обфусцирована. Страница [Безопасность](/docs/site-keys/security) ключа выставляет **Уровень обфускации**: повышение его делает программу труднее для обратной разработки, ценой большего серверного CPU. Те же сигналы стоят за опцией **Блокировать автоматизированные браузеры**, которая наотрез отклоняет выявленные headless- и WebDriver-клиенты.

## Честный предел

Инструментирование не безотказно. Стелс-браузеры латают признаки, которые оно ищет, и сами проверки отмечают, что их можно обойти. Это один слой среди нескольких, сильнейший, когда сложен с [proof of work](/docs/understanding-caputchin/proof-of-work) и остальными настройками [безопасности](/docs/site-keys/security) ключа.
