計測
proof of work は 労力 が費やされたことを証明します。それは 何が それを費やしたかは証明しません。本物のブラウザのファームを持つ決意の固い攻撃者は、安くパズルを挽き続けられます。計測はそのギャップを埋める 2 つ目の層です。作業が本物のブラウザの中で起きたことを証明します。
どう動くか
すべてのリクエストで、Caputchin は新しい、一回限りの JavaScript プログラムを生成し、訪問者のブラウザでそれを走らせます。プログラムは、本物のブラウザだけが持つ仕組みを働かせ、観察したことを報告します:
- ブラウザ API のプローブ。本物のブラウザの機能が存在し、正しく振る舞うことをチェックします。
- ビット単位の整数演算の 計算の連鎖。
- 要素のツリーを作り、レイアウトエンジンがそれらに計算する値を読み、それらを壊し戻す DOM の算術。
仕掛けは非対称性です。本物のレンダリングエンジンはほぼ無料で正しい答えを生むのに対し、headless やスクリプト化されたランタイムは、これらの操作をスタブで埋め、不正確に実装し、または速度のために飛ばします。その食い違いが訪問者を暴きます。
Content-Security-Policy
プログラムは訪問者のブラウザで eval を走らせるので、ウィジェットを埋め込むページは、その script-src の Content-Security-Policy で 'unsafe-eval' を許可しなければなりません。これにはフォールバックがありません。'unsafe-eval' がブロックされると、プログラムは走れず、検証は失敗します。あなたのポリシーがそれを許可できないなら、キーの セキュリティ ページで計測をオフにしてください。それは、自動化ブラウザの検出を犠牲に、要件を取り除きます(proof of work と必須のゲームは引き続き走ります)。完全なホストページのポリシーは ゲームのサンドボックス化 を参照してください。
なぜ proof of work と組み合わさるか
2 つの層は互いの盲点をカバーします。proof of work だけは本物のブラウザによって安く採掘され得て、計測だけは、作業を決してしないスクリプトに偽装され得ます。一緒に、2 つの独立した軸でコストを上げます。proof of work は労力を証明し、計測は環境を証明します。
難読化
プログラムは訪問者に出荷されるので、動機ある攻撃者はそれを研究して答えを事前計算しようとできます。それを難しくするために、プログラムは難読化されます。キーの セキュリティ ページは 難読化レベル を公開します。それを上げると、より多くのサーバー側 CPU を犠牲に、プログラムがリバースエンジニアリングしにくくなります。同じシグナルが 自動化ブラウザをブロック オプションを支え、検出された headless と WebDriver のクライアントをきっぱり拒否します。
正直な限界
計測は完璧ではありません。ステルスブラウザは、それが探す手がかりにパッチを当て、チェック自身も、破られ得ると記しています。それはいくつかの中の 1 つの層で、proof of work とキーの残りの セキュリティ 設定と積み重ねたときに最も強くなります。