mcpField
A
anti-fraud

anti-fraud

github.com/art-of-technologySecurity350 installsUpdated 39w ago
Repository

About anti-fraud

anti-fraud is a bot-detection and fraud-prevention system for registration forms, aimed at developers seeking to detect automated signups while limiting false positives. It combines server-side checks, behavioral signals, and risk scoring, with allowances for password managers and keyboard-only users.

Key features

  1. 01Verify encrypted timestamp tokens
  2. 02Match device fingerprints
  3. 03Detect input and timing anomalies
  4. 04Use honeypots to identify bots
  5. 05Score risk signals and log decisions

Use cases

  1. 01Protect registration forms from bot submissions
  2. 02Detect unusually fast form completion
  3. 03Flag suspicious paste and input patterns
  4. 04Reduce false positives for password managers

Install

Copy the command and run it in a terminal.

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

After installing, type/anti-fraudin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

README.md
.gitignore
references/
signal-weights.md
detection-patterns.md
validators.md

Details

From the project README

Anti-Fraud & Bot Detection System

A three-layer defense system for registration forms that detects bots while minimizing false positives for legitimate users.

Architecture Overview

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

Key Principle: Never trust client-side data alone.

Quick Implementation

1. Form Token Endpoint
// /api/auth/form-token
// Generate AES-256-GCM encrypted token with timestamp
const token = encrypt({ timestamp: Date.now(), fingerprint, nonce });
2. Behavior Tracking Hook
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. Honeypot Fields

Add hidden fields (CSS hidden, aria-hidden, tabIndex=-1):

  • website, phone2, address, company

Any content in honeypot → Instant shadow ban

Risk Scoring

Shadow Ban Triggers (ANY = ban)
TriggerCondition
Server timingFill time < 3 seconds
TokenInvalid or missing
ManipulationHigh confidence detection
Score>= 80 points
HoneypotAny field filled
EmailDisposable domain
Signal Weights

See references/signal-weights.md for complete weight tables.

Critical (+100): HONEYPOT_FILLED, DISPOSABLE_EMAIL
High (+25-40): INSTANT_SUBMIT, ALL_FIELDS_PASTED, BOT_PASSWORD_PATTERN, NO_MOUSE_MOVEMENT
Positive (-5 to -40): PASSWORD_MANAGER_LIKELY, KEYBOARD_ONLY_USER, NATURAL_TYPING_RHYTHM

Shadow Ban Response

if (shouldShadowBan) {
  await delay(1000 + Math.random() * 2000); // Appear legitimate
  return Response.json({ message: 'Registration successful' }, { status: 200 });
  // No account created, no backend call
}

False Positive Prevention

Password Manager Detection (-40 points)
const isPasswordManager = 
  allFieldsAutofilledOrPasted && 
  keystrokeCount < 5 && 
  fillTime >= 1000 && fillTime < 15000;
Keyboard-Only User Detection (-15 points)
const isKeyboardOnly = 
  tabKeyUsed && 
  focusSequence.length >= 2 && 
  !hasMouseActivity && 
  totalFieldTime > 1000;

File Structure

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

Resources

  • Signal weights & thresholds: See references/signal-weights.md
  • Validators (email, name, password): See references/validators.md
  • XML patterns & detection: See references/detection-patterns.md

Environment

AUTH_SECRET=your-secret-key-for-token-encryption

Logging

All decisions logged with [ANTI_FRAUD] prefix:

[ANTI_FRAUD] { timestamp, emailDomain, serverFillTimeMs, summary: 'Risk: 25/100 (low) - allow' }

Comments

Markdown supported