anti-fraud について
anti-fraudは、登録フォーム向けのボット検出・不正対策システムです。自動登録を見つけながら誤検知を抑えたい開発者を対象に、サーバー検証、行動シグナル、リスクスコアを組み合わせます。
主な機能
- 01暗号化タイムスタンプトークンの検証
- 02デバイスフィンガープリントの照合
- 03入力と時間の異常検出
- 04ハニーポットによるボット判定
- 05リスクスコアリングと判断ログ
活用シーン
- 01登録フォームへのボット送信対策
- 02異常に短いフォーム入力の検出
- 03不審な貼り付けや入力パターンの検出
- 04パスワードマネージャー利用者の誤検知低減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ art-of-technology/ anti-fraud-skill --skill anti-fraudインストール後、Claude Code で/anti-fraudを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.md.gitignorereferences/signal-weights.mddetection-patterns.mdvalidators.md詳細
不正利用・ボット検出システム
正当なユーザーの誤検知を最小限に抑えながら、ボットを検出する登録フォーム向けの3層防御システムです。
アーキテクチャの概要
Layer 1: SERVER-SIDE (tamper-proof)
├── Encrypted timestamp token verification
├── Device fingerprint matching
└── Minimum fill time enforcement (3s)
Layer 2: MANIPULATION DETECTION (server comparison)
├── Client vs Server timing mismatch
├── Keystroke/input inconsistency
└── Impossible value detection
Layer 3: CLIENT SIGNALS (informational)
├── Honeypot fields
├── Behavioral analysis
└── Content analysis
重要な原則: クライアント側のデータだけを信用しないでください。
クイック実装
1. フォームトークンのエンドポイント
// /api/auth/form-token
// Generate AES-256-GCM encrypted token with timestamp
const token = encrypt({ timestamp: Date.now(), fingerprint, nonce });
2. 挙動追跡フック
interface BehaviorSignals {
totalFillTimeMs: number;
fieldTimings: Record<string, number>;
inputMethods: Record<string, 'typed' | 'pasted' | 'autofilled' | 'mixed'>;
keystrokes: KeystrokeData[];
keystrokeVariance: number;
mouseMovements: MouseMovement[];
hasMouseActivity: boolean;
focusSequence: string[];
tabKeyUsed: boolean;
backspaceCount: number;
}
3. ハニーポットフィールド
非表示フィールドを追加します(CSSで非表示、aria-hidden、tabIndex=-1)。
website、phone2、address、company
ハニーポットに何らかの入力があれば → 即座にシャドウバン
リスクスコアリング
シャドウバンのトリガー(いずれかに該当するとバン)
| トリガー | 条件 |
|---|---|
| サーバー側の入力時間 | 入力時間 < 3 秒 |
| トークン | 無効または未指定 |
| 不正操作 | 高い確度で検出 |
| スコア | >= 80 ポイント |
| ハニーポット | いずれかのフィールドに入力あり |
| メールアドレス | 使い捨てドメイン |
シグナルの重み
重みの一覧については、references/signal-weights.md を参照してください。
重大(+100): HONEYPOT_FILLED、DISPOSABLE_EMAIL
高(+25~40): INSTANT_SUBMIT、ALL_FIELDS_PASTED、BOT_PASSWORD_PATTERN、NO_MOUSE_MOVEMENT
ポジティブ(-5~-40): PASSWORD_MANAGER_LIKELY、KEYBOARD_ONLY_USER、NATURAL_TYPING_RHYTHM
シャドウバン時の応答
if (shouldShadowBan) {
await delay(1000 + Math.random() * 2000); // Appear legitimate
return Response.json({ message: 'Registration successful' }, { status: 200 });
// No account created, no backend call
}
誤検知の防止
パスワードマネージャーの検出(-40 ポイント)
const isPasswordManager =
allFieldsAutofilledOrPasted &&
keystrokeCount < 5 &&
fillTime >= 1000 && fillTime < 15000;
キーボードのみを使うユーザーの検出(-15 ポイント)
const isKeyboardOnly =
tabKeyUsed &&
focusSequence.length >= 2 &&
!hasMouseActivity &&
totalFieldTime > 1000;
ファイル構成
src/
├── lib/anti-fraud/
│ ├── index.ts
│ ├── types.ts
│ ├── constants.ts
│ ├── risk-scoring.ts
│ ├── server-token.ts
│ ├── manipulation-detector.ts
│ └── validators/
│ ├── email-validator.ts
│ ├── name-validator.ts
│ └── password-validator.ts
├── hooks/use-behavior-tracking.ts
├── components/anti-fraud/honeypot-fields.tsx
└── app/api/auth/
├── form-token/route.ts
└── register/route.ts
リソース
- シグナルの重みとしきい値:
references/signal-weights.mdを参照してください - バリデーター(メールアドレス、名前、パスワード):
references/validators.mdを参照してください - XML パターンと検出:
references/detection-patterns.mdを参照してください
環境
AUTH_SECRET=your-secret-key-for-token-encryption
ログ記録
すべての判定は [ANTI_FRAUD] プレフィックス付きで記録されます。
[ANTI_FRAUD] { timestamp, emailDomain, serverFillTimeMs, summary: 'Risk: 25/100 (low) - allow' }
コメント
Markdown 対応