# Escudos por tecnología

> Ocho protecciones concretas tras las reglas del WAF: WordPress, SSRF, redirecciones abiertas, paginación, source maps, GraphQL e inyección de prompts.

Los escudos son comprobaciones pequeñas y específicas que el borde ejecuta después de OWASP CRS y de las reglas de OpenWAF. Cada uno tiene un pseudoidentificador de regla entre 1001 y 1008: es el que aparece en los eventos de seguridad y el `rule_id` que usas en una [excepción del WAF](https://developers.openwaf.dev/es/waf/waf-exceptions/#rule-id) para apagar el escudo en una ruta.

Los escudos siguen el [modo](https://developers.openwaf.dev/es/waf/modes-and-levels/#modes) del sitio: bloquean en `active`, solo registran en `log` y no se ejecutan en `off` (ni con `waf_level=off`).

| Id | Escudo | Bloquea | Respuesta |
|---|---|---|---|
| 1001 | Endurecimiento de WordPress | Solo en sitios con `stack=wordpress`. | 404 |
| 1002 | SSRF (query) | Parámetros de la query que llevan una URL a una dirección interna. | 403 |
| 1003 | Redirección abierta | Parámetros de la query que redirigen a otro sitio. | 403 |
| 1004 | Paginación | Una IP que recorre muchas páginas consecutivas. | 429 |
| 1005 | Source maps | Peticiones de ficheros `.map`. | 404 |
| 1006 | GraphQL | Introspección y consultas muy profundas. | 404 |
| 1007 | Inyección de prompts | Frases de *jailbreak* enviadas a rutas de endpoints de IA. | 403 |
| 1008 | SSRF (cuerpo JSON) | URL a direcciones internas dentro de cuerpos JSON. | 403 |

Una excepción con `rule_id` 0 (todas las reglas del WAF) **no** apaga los escudos: usa el identificador del propio escudo.

## Endurecimiento de WordPress

En los sitios con `stack=wordpress`, responde 404 a `/xmlrpc.php`, a `/wp-json/wp/v2/users` sin cabecera `Authorization` (enumeración de usuarios), a `/wp-includes/version.php` y `/readme.html` (revelan la versión) y a cualquier ruta que contenga `wp-config`.

## SSRF

Revisa los valores de los parámetros de la query llamados `url`, `webhook_url`, `callback_url`, `target_url`, `redirect_url`, `return_url`, `dest`, `destination`, `uri`, `endpoint`, `proxy`, `fetch`, `src`, `href`, `link`, `next` o `continue` (1002), y cada texto con forma de URL absoluta dentro de un cuerpo JSON (1008). Bloquea:

- los esquemas `file`, `gopher`, `dict`, `ldap`, `jar` y `netdoc`;
- los nombres `localhost`, `metadata`, `metadata.google.internal`, `metadata.azure.com` y cualquier nombre que acabe en `.localhost` o `.internal`;
- las direcciones de *loopback*, privadas, de enlace local, sin especificar y de CGNAT (`100.64.0.0/10`), también escritas en hexadecimal, octal o decimal, como `0x7f.1` o `2130706433`.

Las rutas relativas y el texto libre nunca se bloquean.

## Redirección abierta

Revisa los parámetros de la query llamados `redirect`, `redirect_url`, `redirect_uri`, `return`, `return_url`, `returnto`, `return_to`, `next`, `dest`, `destination`, `rurl`, `continue`, `callback`, `callback_url`, `forward`, `goto`, `success_url`, `cancel_url`, `checkout_url` o `payment_url`. Una URL absoluta o relativa al protocolo (`//evil.example`, `https:\\evil.example`) solo pasa si apunta a:

- el mismo dominio registrable que el sitio (`api.example.com` puede redirigir a `example.com`);
- un host de `redirect_allow_hosts` del sitio ([ajustes](https://developers.openwaf.dev/es/waf/settings/#redirect-allow-hosts)): cada entrada vale para sí misma y sus subdominios;
- un proveedor de pagos que cualquier sitio puede usar, como `stripe.com`.

## Paginación

Bloquea una IP que pide 40 páginas consecutivas de la misma ruta en 5 minutos (`?page=` u `?offset=` con `limit`, `take`, `size`, `per_page`, `pageSize`, `page_size` o `perPage`). El *scroll* infinito de una persona queda muy por debajo.

## Source maps

Responde 404 a cualquier ruta que acabe en `.map`, para que nunca se sirvan los *source maps* que revelan tu código fuente.

## GraphQL

En las rutas que acaban en `/graphql`: bloquea la introspección (`__schema`, `__type`…) y las consultas con más de 10 niveles de anidación.

## Inyección de prompts

En las rutas que contienen `/ai/`, `/search-ai/`, `/chat/`, `/assistant/`, `/copilot/`, `/api/ai/`, `/api/chat/` o `/api/assistant/`: bloquea los cuerpos con frases de *jailbreak* conocidas en inglés, como «ignore previous instructions», la extracción del prompt de sistema o «developer mode». Para una política completa en tus propios endpoints de IA (detectores en inglés y español, tope de cuerpo, límites por IP y por sesión), usa la [protección de endpoints de IA](https://developers.openwaf.dev/es/ai-crawl-control/ai-endpoints/).

## Inspección del cuerpo

Los escudos de cuerpo (GraphQL, inyección de prompts, SSRF en JSON) leen hasta 1 MiB de un cuerpo JSON, GraphQL o de endpoint de IA y siempre reenvían el cuerpo entero. No inspeccionan las subidas *multipart*. Un cuerpo mayor que ese límite se rechaza con 413, salvo que la ruta tenga una excepción del WAF para la regla 10101 (consulta [Solución de problemas](https://developers.openwaf.dev/es/waf/troubleshooting/#large-bodies)).
