mcpField
A
anti-fraud

anti-fraud

github.com/art-of-technologyセキュリティ350 回インストール39 週間前に更新
リポジトリ

anti-fraud について

anti-fraudは、登録フォーム向けのボット検出・不正対策システムです。自動登録を見つけながら誤検知を抑えたい開発者を対象に、サーバー検証、行動シグナル、リスクスコアを組み合わせます。

主な機能

  1. 01暗号化タイムスタンプトークンの検証
  2. 02デバイスフィンガープリントの照合
  3. 03入力と時間の異常検出
  4. 04ハニーポットによるボット判定
  5. 05リスクスコアリングと判断ログ

活用シーン

  1. 01登録フォームへのボット送信対策
  2. 02異常に短いフォーム入力の検出
  3. 03不審な貼り付けや入力パターンの検出
  4. 04パスワードマネージャー利用者の誤検知低減

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/art-of-technology/anti-fraud-skill --skill anti-fraud

インストール後、Claude Code で/anti-fraudを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
.gitignore
references/
signal-weights.md
detection-patterns.md
validators.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' }

コメント