Инструментирование
Proof of work доказывает, что усилие было потрачено. Он не доказывает, что его потратило. Упорный злоумышленник с фермой настоящих браузеров может дёшево перемалывать головоломки. Инструментирование это второй слой, который закрывает этот разрыв: оно доказывает, что работа произошла внутри подлинного браузера.
Как это работает
На каждом запросе Caputchin генерирует свежую, одноразовую программу на JavaScript и запускает её в браузере посетителя. Программа задействует машинерию, которая есть только у настоящего браузера, и отчитывается о том, что наблюдала:
- Пробы браузерного API, которые проверяют, что подлинная функциональность браузера присутствует и ведёт себя правильно.
- Цепочки вычислений из побитовых целочисленных операций.
- DOM-арифметика, которая строит деревья элементов, читает значения, которые движок раскладки для них вычисляет, и разбирает их обратно.
Фокус в асимметрии: настоящий рендеринг-движок выдаёт правильные ответы почти задаром, а headless- или скриптовый рантайм заглушает эти операции, реализует их неправильно или пропускает ради скорости. Несоответствие выдаёт посетителя.
Content-Security-Policy
Поскольку программа запускает eval в браузере посетителя, страница, встраивающая твой виджет, должна разрешать 'unsafe-eval' в своей Content-Security-Policy script-src. Для этого нет отката: если 'unsafe-eval' заблокирован, программа не может запуститься, и проверка сбоит. Если твоя политика не может его разрешить, выключи инструментирование для ключа на его странице Безопасность, что снимает требование ценой выявления автоматизированных браузеров (proof of work и любая требуемая игра по-прежнему работают). Смотри изоляцию игр в песочнице для полной политики хост-страницы.
Почему оно в паре с proof of work
Два слоя покрывают слепые зоны друг друга. Proof of work в одиночку можно дёшево намайнить настоящими браузерами; инструментирование в одиночку мог бы подделать скрипт, который никогда не делает работу. Вместе они поднимают цену по двум независимым осям: proof of work доказывает усилие, инструментирование доказывает окружение.
Обфускация
Поскольку программа поставляется посетителю, мотивированный злоумышленник мог бы изучить её и попробовать предвычислить ответы. Чтобы сделать это труднее, программа обфусцирована. Страница Безопасность ключа выставляет Уровень обфускации: повышение его делает программу труднее для обратной разработки, ценой большего серверного CPU. Те же сигналы стоят за опцией Блокировать автоматизированные браузеры, которая наотрез отклоняет выявленные headless- и WebDriver-клиенты.
Честный предел
Инструментирование не безотказно. Стелс-браузеры латают признаки, которые оно ищет, и сами проверки отмечают, что их можно обойти. Это один слой среди нескольких, сильнейший, когда сложен с proof of work и остальными настройками безопасности ключа.