コンテンツへスキップ
Guide

キャプチャ不要の 3 つの API チェックでサインアップ詐欺を阻止

| 7 min read

キャプチャはコンバージョンに悪影響を及ぼしますが、とにかくボットがそれらを解決します。 VPN、使い捨て電子メール、および IP ブロックリスト チェックインを使用した各サインアップを 120 ミリ秒未満でスコアリングし、上位 5% のみに挑戦します。

Digital security shield representing signup fraud detection and scoring
Photo by Franck on Unsplash

ボットはキャプチャの予算よりも安価です。 商用ソルブファームは reCAPTCHA v2 を千あたり約 1 ドルでクリアするため、50,000 の使い捨てアカウントが必要なスクレイパーは、スクリプトを実行するための VPS よりもキャプチャに費やす費用が少なくなります。 一方、実際のユーザーは 3 ~ 15% のクリップでパズルから跳ね返されます。

より良いフェンスが得点となります。 3 つの API 呼び出しにより、サインアップの 95% を摩擦なしで通過させ、残りのスライスにチャレンジまたはブロックするのに十分な信号が得られます。 P99 の合計レイテンシは 120 ミリ秒未満。

3 つのシグナル、3 つのエンドポイント

すべてのサインアップには IP と電子メールが含まれます。 3 つの狭い質問をするのには十分です。

IP は VPN、Tor 出口、またはデータセンターですか?

実際の消費者のサインアップが AWS CIDR ブロックから開始されることはほとんどありません。 Tor 出口ノードが SaaS の無料トライアルにサインアップすることはほとんどありません。 の /v1/vpn-detect エンドポイントは 3 つすべてをチェックします。

{
  "ip": "34.102.55.10",
  "is_vpn": true,
  "is_tor": false,
  "is_datacenter": true,
  "provider": "Google Cloud",
  "risk_score": 60
}

メールは使い捨てドメインを使用していますか?

使い捨てプロバイダー (mailinator、guerillamail、tempmail) は、受信トレイを数分でローテーションします。 サインアップが使い捨てドメインにヒットした場合、ユーザーはフォローアップを受けるつもりはありません。 /v1/disposable-email/check 700 を超える既知のプロバイダーとヒューリスティック パターンにフラグを立てます。

{
  "email": "user@mailinator.com",
  "domain": "mailinator.com",
  "is_disposable": true,
  "is_free": false,
  "provider": "Mailinator"
}

IP は bogon 範囲内にありますか、またはレピュテーション リストにありますか?

Bogon IP はオープン インターネットからサーバーに決して到達してはなりません。 これらは、スプーフィングされたヘッダーまたは壊れたプロキシを示します。 不審な逆引き DNS (「プロキシ」、「トール」、「スパム」を含むホスト名) も、安易な情報です。 /v1/ip-blocklist/check リスクレベルとチェックごとの内訳を返します。

{
  "ip": "185.220.101.5",
  "is_private": false,
  "is_bogon": false,
  "reverse_dns": "tor-exit-1.example.org",
  "risk_level": "high"
}

重み付けとスコアを 1 つの関数で実行

3 つすべてを並行して呼び出し、加重ポイントを追加し、100 にクランプして、判定を選択します。 しきい値は製品ごとに調整可能です。 チャレンジとして 20 と 70 から開始し、ブロックカットします。

// signup-score.ts
type Verdict = 'allow' | 'challenge' | 'block';

export async function scoreSignup(input: {
  ip: string;
  email: string;
}): Promise<{ score: number; verdict: Verdict; signals: Record<string, unknown> }> {
  const [vpn, email, blocklist] = await Promise.all([
    fetch('https://api.botoi.com/v1/vpn-detect', postJson({ ip: input.ip })).then(r => r.json()),
    fetch('https://api.botoi.com/v1/disposable-email/check', postJson({ email: input.email })).then(r => r.json()),
    fetch('https://api.botoi.com/v1/ip-blocklist/check', postJson({ ip: input.ip })).then(r => r.json()),
  ]);

  let score = 0;
  if (vpn.is_tor) score += 80;
  else if (vpn.is_datacenter) score += 50;
  else if (vpn.is_vpn) score += 35;

  if (email.is_disposable) score += 60;
  else if (email.is_free) score += 10;

  if (blocklist.risk_level === 'high') score += 40;
  else if (blocklist.risk_level === 'medium') score += 20;

  const verdict: Verdict = score >= 70 ? 'block' : score >= 20 ? 'challenge' : 'allow';
  return { score: Math.min(score, 100), verdict, signals: { vpn, email, blocklist } };
}

function postJson(body: unknown): RequestInit {
  return {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: \`Bearer \${process.env.BOTOI_API_KEY}\`,
    },
    body: JSON.stringify(body),
  };
}

重みについていくつか注意事項があります。 Tor は強力な信号です。 80 ポイントだけでもリクエストはブロック バンドに入ります。 データセンター IP は多くのボット トラフィックをキャッチしますが、正規の常時接続 VPN ユーザーもキャッチするため、50 ポイントではブロックではなくチャレンジにさらされます。 実際のユーザーがメイリネーターを選択することはほとんどないため、使い捨てメールは 60 ポイントを獲得します。

サインアップルートに接続します

ユーザー作成の直前にスコア呼び出しを配置し​​ます。 ブロックバンドを拒否し、チャレンジバンドで電子メール認証を要求し、残りはそのまま通過させます。

// app/api/signup/route.ts (Next.js)
import { NextResponse } from 'next/server';
import { scoreSignup } from '@/lib/signup-score';

export async function POST(req: Request) {
  const body = await req.json();
  const ip = req.headers.get('x-forwarded-for')?.split(',')[0] ?? '0.0.0.0';

  const result = await scoreSignup({ ip, email: body.email });

  if (result.verdict === 'block') {
    await auditLog({ type: 'signup.blocked', ip, email: body.email, score: result.score });
    return NextResponse.json({ error: 'signup_rejected' }, { status: 403 });
  }

  const user = await createUser({
    email: body.email,
    password: body.password,
    requiresEmailVerification: result.verdict === 'challenge',
    riskScore: result.score,
  });

  return NextResponse.json({ user });
}

あらゆる決定を監査する

データがなければしきい値を調整することはできません。 サインアップごとにスコアと生のシグナルを保持します。

// Persist the score and signals with the user row for later calibration.
await db.signupAudit.insert({
  userId: user.id,
  ip,
  score: result.score,
  verdict: result.verdict,
  signals: result.signals,
  createdAt: new Date(),
});

チャーンと乱用に対して毎週調整する

週に 1 回レポートを実行します。 スコアが高いほど、解約率、返金率、または不正行為の報告が増えることが予測されますか? スコア 60 のサインアップのチャーン率が 80%、スコア 10 のサインアップのチャーン率が 4% の場合、重みが調整され、ブロックのしきい値を厳しくすることができます。 勾配が平坦な場合は、重みを再設定します。

-- rerun weekly: does the score predict churn and abuse?
SELECT
  FLOOR(score / 10) * 10 AS score_bucket,
  COUNT(*) AS signups,
  ROUND(100.0 * SUM(CASE WHEN churned THEN 1 ELSE 0 END) / COUNT(*), 1) AS churn_pct,
  ROUND(100.0 * SUM(CASE WHEN abuse_reported THEN 1 ELSE 0 END) / COUNT(*), 1) AS abuse_pct
FROM signup_audit
WHERE created_at > NOW() - INTERVAL '90 days'
GROUP BY 1
ORDER BY 1;

目標は単調曲線です。 各スコア バケットの結果は、その下のスコア バケットよりも悪い結果になるはずです。 そうでない場合は、信号 (デバイスの指紋、同じ /24 からのサインアップ速度) を追加するか、それ自身の重みを引っ張らない重りを削除します。

これが当てはまるところとキャプチャ

アプローチ 実際のユーザーにとっての摩擦 攻撃者のコスト P99 レイテンシ
reCAPTCHA v2 3 ~ 15% のドロップオフ 1,000 回の解決ごとに 1 ドル 300~800ミリ秒
hCaptcha エンタープライズ 2~8%のドロップオフ 1,000 あたり 1 ~ 2 ドル 250~600ミリ秒
3信号スコア 95% のユーザーで 0% クリーンな IP と実際のメールボックスを取得する必要がある 80~120ミリ秒

米国の銀行でボット耐性のあるログイン フローが必要な場合、スコアはキャプチャに代わるものではありません。 これは、SaaS サインアップ、ニュースレター、トライアル ゲートの正しいデフォルトです。

これでカバーされないもの

  • ログイン時の資格情報のスタッフィング: パスキーまたはアカウントごとのレート制限を使用します。
  • 住宅用プロキシからの調整されたサインアップ バースト: /24 ごとおよび電子メール ドメインとサインアップ分ごとの速度制限を追加します。
  • 使い捨てアドレスを使用して電子メール認証を完了したユーザー: チャレンジ バンドの機能アクセスを 24 時間凍結するように設定します。

API キーを取得してドロップします。

無料のキーを取得するには、 botoi.com/api/signup。 無料利用枠は 1 日あたり 1,000 スコアをカバーしており、最近 1 週間のサインアップに対して調整を実行するには十分です。 有料プランは、1 日あたり 10,000 リクエストの場合、月額 9 ドルから始まります。

各エンドポイントの完全なリファレンス: VPN 検出 API使い捨てメールチェックAPI、 そして IPブロックリストチェックAPI

FAQ

代わりにキャプチャを使用してみてはいかがでしょうか?
キャプチャの変換コスト (通常の低下: 実際のユーザーの 3 ~ 15%) と商用 CAPTCHA ファームにより、reCAPTCHA v2 は 1,000 件あたり 1 ドル未満で解決されます。 シグナルによるスコアリングでは、サインアップの 95% の摩擦をスキップし、疑わしいスライスのみに挑戦します。
スコアにはどのようなシグナルが含まれますか?
3 つ: VPN/Tor/データセンターの IP フラグ、使い捨てまたは使い捨ての電子メール ドメイン、および IP ブロックリストのヒット (ボーゴン、不審なホスト名)。 それぞれ 50 ミリ秒以内に戻ります。 0 ~ 100 のリスク スコアを得るためにそれらを重み付けし、しきい値ごとに決定します。
データセンターの IP をブロックすると、実際のユーザーに悪影響を及ぼしますか?
企業およびコンシューマの IP はデータセンターの CIDR ブロックと一致しません。 影響を受ける実際のユーザーは常時接続 VPN を使用しているユーザーのみであり、通常は完全にブロックするのではなく、セカンダリ検証パスにルーティングできる少数派です。
低信号中間をどのように処理すればよいですか?
スコアが 70 を超えるとブロックします。 スコアが 20 未満: 許可します。 20 ~ 70 の場合: 電子メール認証またはステップアップ (SMS コード、パスキー) が必要です。 摩擦をファネル全体ではなく、危険なバンドに移します。
過去のサインアップに対してスコアをテストできますか?
はい。 3 つのエンドポイントを通じて過去 90 日間のサインアップを再生し、チャーン、返金、不正行為レポートの列とスコアを結合し、何かを強制する前にしきい値を調整します。 各エンドポイントは、同じ入力で繰り返し呼び出しを行っても安定した状態を保ちます。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。