Proof of work
Каждая проверка просит браузер посетителя решить маленькую вычислительную головоломку до того, как Caputchin выдаст токен. Эта головоломка и есть proof of work.
Как это работает
Caputchin вручает браузеру испытание и просит его найти число (nonce), которое, будучи захешированным вместе с испытанием, даёт хеш, начинающийся с требуемого числа ведущих нулей. Короткого пути нет: браузеру приходится пробовать nonce за nonce, пока один случайно не сработает. Найти валидный nonce берёт много попыток; проверить один это один хеш. Так что работа трудна, но дешева в проверке, и Caputchin подтверждает, что ответ проходит требуемую сложность.
Content-Security-Policy
Решатель работает в Web Worker, который виджет создаёт из blob:-URL, так что Content-Security-Policy встраивающей страницы должна разрешать blob: для воркеров (worker-src blob: или child-src / default-src как цепочка отката). Эта часть обязательна: нет отката на основной поток, так что политика, блокирующая воркер, блокирует проверку. Отдельно решатель компилирует процедуру WebAssembly для скорости, которой нужен 'wasm-unsafe-eval' в script-src. Эта часть опциональна: без неё тот же решатель работает медленнее на чистом JavaScript внутри Worker. Смотри изоляцию игр в песочнице для полной политики хост-страницы.
Почему это сдерживает злоупотребление
Суть не в том, чтобы сделать любое единичное решение невозможным. Она в том, чтобы сделать злоупотребление в масштабе неэкономичным.
Реальный посетитель решает одну головоломку за долю секунды и никогда не замечает. Бот, который хочет выпустить тысячи запросов, платит эту вычислительную цену тысячи раз сверху. Если прохождение испытания стоит больше, чем стоит спам, атака перестаёт иметь финансовый смысл. Proof of work смещает цель с «нерушимо» на «не стоит того».
Ручки
Две настройки на странице Безопасность ключа настраивают цену:
- Сложность задаёт, сколько ведущих нулей должен иметь хеш, что поднимает цену каждого решения.
- Испытаний на запрос умножает эту цену, прося несколько решений сразу.
Честный предел
Никакое испытание не нерушимо; при достаточных деньгах решить можно что угодно. Proof of work принимает это и состязается на цене вместо этого. Он также доказывает лишь, что усилие было потрачено, а не что его потратил настоящий браузер, поэтому Caputchin сочетает его с инструментированием, чтобы проверить и окружение.