サインアップフォームは、インターネット上で最も安く攻撃できるものです。推測すべきパスワードも盗むべきカードもなく、作られたアカウントはどれも誰かにとって価値があります。転売する無料トライアル、稼ぐための紹介ボーナス、スパム用の受信箱、後の不正に備えて寝かせておくアカウントなどです。サインアップが一晩で急増し、アクティベーション率が下がったなら、おそらくスクリプトがフォームを埋めています。
偽のサインアップがもたらす損失
- お金:無料クレジット、トライアルのコンピュート、SMS やメールの確認費用、紹介報酬。
- データ:決してコンバージョンしないアカウントでファネルが埋まり、本当の顧客の行動が見えなくなります。
- 評判:架空の、または盗まれたアドレスへの確認メールがバウンスし、送信者スコアを下げます。
- 後の不正:今日作られたアカウントが、来月にはスパム、スクレイピング、カードのテストに使われます。
CAPTCHA が答えにならない理由
CAPTCHA 解読サービスは、人や AI モデルを使って 1 問あたり 1 セントをはるかに下回る価格でパズルを解きます。本気の攻撃者はわずかなお金を払って通り抜けてしまいます。一方、本当の訪問者は全額を払うことになります。パズルを出すたびに一部の人が離脱し、スマートフォンではなおさらです。CAPTCHA は、コストを間違った側に押し付けているのです。
スクリプトによるサインアップを見破る手がかり
単独で証拠になるシグナルはなく、User-Agent のように攻撃者が制御できるものはすべて偽装できます。スクリプトにとって難しいのは、多数のシグナルにわたって同時に一貫性を保つことと、時間をかけて人のように振る舞うことです。
- 自動化のフラグ。ヘッドレスブラウザや操作されたブラウザは、今でも痕跡を残します。
navigator.webdriver、ソフトウェア GPU、欠けているブラウザ機能などです。 - 矛盾。Windows を名乗る User-Agent なのにブラウザは Linux を報告している、タイムゾーンがネットワークと合わない、Client Hints がヘッダーと食い違う、といったものです。
- ネットワーク。家庭や携帯電話ではなく、ホスティング事業者からのサインアップ。ただしこれ単独では弱い証拠です。VPN の利用者も本当の人だからです。
- ファンアウト。1 台のデバイス、1 つの token、1 つのサブネットが、数分で多数のアカウントを作成している。
- ページの欠如。サインアップページを一度も読み込んでいないクライアントから、サインアップのエンドポイントへのリクエストがある。
アカウントが作られる前に、サーバーで判定する
判定は、スクリプトが読み飛ばせるブラウザではなく、アカウントが作成される場所に置くべきです。ユーザーを登録する前に、短い timeout でリクエストについての判定を問い合わせてください。
POST /v1/decide
{ "ip": "203.0.113.10", "user_agent": "Mozilla/5.0 …",
"token": "<_kz cookie>", "path": "/signup" }
そして、返ってきたクラスに応じて、確実なものから順に対応します。
- bot high:サインアップを拒否します。
- bot:アカウントは作成しますが、メールアドレスが確認されるまでトライアルのクレジットを保留するか、電話番号を求めます。
- unknown、human、human high:通常どおり通します。
フォームをブロックするのではなく報酬を保留することで、偽のサインアップは割に合わなくなります。しかも、VPN を使っていただけの本当の顧客を追い返すこともありません。
fail-open
チェックが遅いときや止まっているときは、サインアップを通してください。障害中にいくつかの偽アカウントができても、サインアップページが動かなくなるよりはるかに損失は小さく済みます。詳しくはbot チェックが fail-open でなければならない理由に書きました。