Proof of work
يطلب كل تحقّق من متصفّح الزائر حلّ لغز حوسبي صغير قبل أن يصدر Caputchin رمزًا. ذلك اللغز هو الـ proof of work.
كيف يعمل
يسلّم Caputchin المتصفّح تحديًا ويطلب منه إيجاد عدد (nonce) ينتج، حين يُجزَّأ مع التحدّي، تجزئةً تبدأ بعدد مطلوب من الأصفار البادئة. لا اختصار: على المتصفّح تجربة nonce بعد nonce حتى يصادف واحد فينجح. إيجاد nonce صالح يأخذ محاولات كثيرة؛ وفحص واحد تجزئة واحدة. فالعمل صعب الأداء رخيص الفحص، ويؤكّد Caputchin أن الجواب يجتاز الصعوبة المطلوبة.
Content-Security-Policy
يعمل الحلّال في Web Worker، تنشئه الأداة من رابط blob:، فيجب أن تسمح سياسة Content-Security-Policy للصفحة المُضمِّنة بـ blob: للعمّال (worker-src blob:، أو child-src / default-src كسلسلة الارتداد). هذا الجزء مطلوب: لا ارتداد للخيط الرئيسي، فسياسة تحجب العامل تحجب التحقّق. منفصلًا، يصرّف الحلّال روتين WebAssembly للسرعة، ويحتاج 'wasm-unsafe-eval' في script-src. ذلك الجزء اختياري: بدونه يعمل الحلّال نفسه أبطأ بـ JavaScript خالص داخل العامل. انظر عزل اللعبة لسياسة الصفحة المضيفة كاملةً.
لماذا يردع الإساءة
المقصد ليس جعل أي حلٍّ منفرد مستحيلًا. بل جعل الإساءة بالجملة غير اقتصادية.
زائر حقيقي يحلّ لغزًا في جزء من الثانية ولا يلاحظ أبدًا. روبوت يريد إطلاق آلاف الطلبات يدفع كلفة الحوسبة تلك آلاف المرّات. إن كان اجتياز التحدّي يكلّف أكثر مما تساويه الرسائل المزعجة، يتوقّف الهجوم عن أن يكون منطقيًّا ماليًّا. ينقل proof of work الهدف من "غير قابل للكسر" إلى "لا يستحقّ العناء".
المقابض
إعدادان على صفحة الأمان لمفتاح يضبطان الكلفة:
- الصعوبة تضبط كم صفرًا بادئًا يجب أن يكون للتجزئة، وهو ما يرفع كلفة كل حلّ.
- تحدّيات لكل طلب تضاعف تلك الكلفة بطلب عدّة حلول دفعة واحدة.
حدّ صادق
لا تحدّي غير قابل للكسر؛ بما يكفي من المال، يمكن حلّ أي شيء. يقبل proof of work ذلك وينافس على الكلفة بدلًا. كما أنه يثبت فقط أن جهدًا بُذِل، لا أن متصفّحًا حقيقيًّا بذله، ولهذا يقرنه Caputchin بـ الرصد لفحص البيئة أيضًا.