Detección

Cómo puntúa el motor de riesgo, cómo se aplican perfiles y políticas y qué ocurre bajo ataque.

Risk Engine adaptativa

El risk score es la suma ponderada de todas las penalizaciones (0-100). Los umbrales los determina el perfil de sitio activo y la política de formulario. La respuesta V2 incluye además un Confidence Score (0.0-1.0) y Reason Codes legibles por máquina.

Score Acción Significado
0-29allowHumano, dejar pasar
30-59challengeSospecha, se deja pasar pero se registra
60-100blockBot detectado, bloquear

Factores de penalización

pow_failed:          +100   PoW falsch oder fehlend
nonce_reused:        +100   Replay-Angriff
ip_blocked:          +100   IP auf Blockliste
rate_limit_hit:       +80   Zu viele Requests
user_agent_headless:  +70   Puppeteer/Playwright
tor_exit:             +60   TOR Exit Node
behavior_bot:         +50   Verhalten bot-typisch
time_too_fast:        +35   Submit < 1.5 Sekunden
asn_hosting:          +25   Rechenzentrum-ASN
behavior_suspicious:  +20   Verhalten verdächtig

V2.1 Advanced Bot Detection

Señales adicionales que desenmascaran incluso navegadores headless camuflados. Todas las comprobaciones son sensibles al contexto: los dispositivos móviles y los navegadores centrados en la privacidad (Safari/Firefox) se reconocen correctamente como legítimos y no se marcan por error.

env_automation_globals: +90   Selenium/Puppeteer/CDP Leak im window-Objekt
env_ua_brand_bot:       +80   UA Client Hints verraten Automation-Framework
env_software_renderer:  +50   WebGL nutzt SwiftShader/llvmpipe = headless
env_canvas_too_fast:    +40   Canvas-Render < 2ms = headless (Mensch: 5-50ms)
env_no_storage:         +30   localStorage UND indexedDB fehlen
env_raf_robotic:        +25   requestAnimationFrame perfekt uniform (CV < 0.05)
env_no_webgl_ext:       +25   0 WebGL-Extensions auf Desktop = headless
header_no_sec_fetch:    +25   Sec-Fetch-* Header fehlen = altes/scripted Client
header_no_accept_lang:  +20   Accept-Language fehlt = scripted
env_no_hover:           +5    Hover nicht unterstützt (selten valide auf Desktop)
env_audio_hash_missing: +5    OfflineAudioContext blockiert (Privacy-Browser ok)

V2.1 aumenta considerablemente la tasa de detección de frameworks stealth (Playwright Stealth, Puppeteer Stealth) sin afectar a los usuarios legítimos.

Perfiles de sitio y políticas de formulario

La Risk Engine V2 evalúa según el contexto: los formularios de inicio de sesión se evalúan con más rigor que los formularios de contacto. Los perfiles de sitio definen la postura base y las políticas de formulario la ajustan por tipo de formulario.

Perfiles de sitio (presets)

Cada sitio se asigna a un perfil. El perfil determina los umbrales, los tipos de challenge y las ponderaciones de comportamiento.

Perfil Allow < Challenge < Difficulty Uso
Low Friction 40 70 2 Newsletter, comentarios, páginas informativas
Balanced 30 60 4 Estándar para la mayoría de los formularios
Auth Hardened 20 50 5 Login, registro, restablecimiento de contraseña
High Security 15 40 6 Checkout, acciones de administración, pago

Políticas de formulario

Las políticas de formulario anulan el perfil de sitio para determinados tipos de formulario. El form_type se envía con la petición de verify.

form_type Perfil Allow < Challenge < Modo de fallo
login Auth Hardened 20 50 fail_closed
register Auth Hardened 20 50 fail_closed
password_reset High Security 15 40 fail_closed
checkout High Security 15 40 fail_closed
contact Balanced 30 60 fail_open
comment Low Friction 35 65 fail_open
newsletter Low Friction 40 70 fail_open

Orden de fusión

Los niveles posteriores anulan los anteriores:

1. Globale Defaults     (config: allow<30, challenge<60)
2. Site-Profil           (z.B. "Auth Hardened" → allow<20, challenge<50)
3. Form-Policy           (z.B. login → allow<15, fail_closed)

Integración (desarrolladores)

El form_type se indica al integrar el widget y en la petición de verify:

<!-- Widget: form_type als data-Attribut -->
<form data-captchacore="interactive" data-form-type="login">
    <div data-captchacore-widget data-form-type="login"></div>
</form>

// Verify-Request: form_type im Body
POST /api/v2/verify
{
    "token":     "...",
    "form_type": "login"   // Steuert welche Policy angewendet wird
}

Tipos disponibles: login, register, contact, comment, checkout, password_reset, newsletter, custom. Sin form_type se usan los valores globales por defecto.

Under-Attack-Mode

Durante un ataque (tasa de bloqueo alta), la protección puede reforzarse:

Activación automática

Si más del 70% de todas las peticiones se bloquean en una ventana de 5 minutos, el UAM se activa automáticamente.

# Konfigurierbar in den globalen Einstellungen
uam.auto_threshold:        0.70     # 70% Block-Rate
uam.window_minutes:        5
uam.auto_deactivate_after: 3600     # 1 Stunde
uam.cookie_ttl_minutes:    30

En el UAM la dificultad del PoW aumenta en +1 nivel. Los visitantes verificados reciben una cookie de acceso firmada con HMAC (HttpOnly, SameSite=Strict).