Seguridad en APIs GraphQL: Mitigación de DoS Complejo
Aprende a proteger servidores GraphQL frente a ataques de denegación de servicio por consultas anidadas y cálculo de complejidad en 2026.

La seguridad en APIs GraphQL constituye en 2026 una de las prioridades técnicas más apremiantes para empresas que ofrecen servicios web modernos y aplicaciones móviles interactivas. Aunque la flexibilidad de GraphQL permite a los clientes solicitar exactamente los datos requeridos en un único viaje de red (round-trip), esta misma característica abre la puerta a vectores severos de denegación de servicio (DoS) basados en consultas recursivas hiper-anidadas y ataques de amplificación de base de datos (N+1 Query Attacks).
Un único payload malicioso de pocos kilobytes que contenga relaciones circulares (autor -> libros -> autor -> libros...) puede desencadenar millones de consultas a los motores SQL o NoSQL subyacentes, paralizando por completo el clúster de producción.
Vectores de Saturación en Arquitecturas GraphQL
Los atacantes explotan la naturaleza declarativa del protocolo mediante tres estrategias principales:
- Recursión Infinita por Profundidad: Anidamiento excesivo de tipos relacionales para saturar el stack de ejecución del motor de resolución.
- Consultas Masivas por Alias: Inclusión de miles de campos duplicados mediante alias (
p1: usuario(id:1), p2: usuario(id:2)...) para sortear los rate limits basados en conteo de peticiones HTTP. - Ataques de Paginación Desmedida: Peticiones con argumentos de tamaño extremo (
usuarios(first: 1000000)) que agotan la memoria RAM del servidor.
Para optimizar el rendimiento del código frontend y minimizar la sobrecarga de scripts en clientes web, puedes utilizar nuestro Minificador de CSS y JavaScript.
Matriz de Defensas en Servidores GraphQL
| Vector de Ataque | Mecanismo de Explotación | Impacto en Servidor | Contramedida Técnica Obligatoria |
|---|---|---|---|
| Deep Query Nesting | Árboles anidados circulares | Consumo masivo de CPU y stack overflow | Query Depth Limiting (profundidad máxima) |
| Field Duplication / Aliasing | Múltiples alias en una petición | Bypass de rate limiting | Query Complexity / Cost Analysis |
| Batch Request Flooding | Arrays masivos en endpoint /graphql |
Saturación de workers Node/Go | Deshabilitar batching o limitar a 5 operaciones |
| Schema Introspection Leak | Consulta __schema en producción |
Mapeo de superficies de ataque | Deshabilitar introspección en entornos públicos |
Implementación de Depth Limiting y Complexity en Node.js
A continuación se muestra una configuración para Apollo Server y Yoga utilizando graphql-depth-limit y reglas de validación AST:
import { ApolloServer } from '@apollo/server';
import depthLimit from 'graphql-depth-limit';
import { createComplexityRule, simpleEstimator } from 'graphql-query-complexity';
// Regla de complejidad de costos por consulta
const complexityRule = createComplexityRule({
maximumComplexity: 1000,
estimators: [
simpleEstimator({ defaultComplexity: 1 })
],
onCost: (cost) => {
console.log(`Costo computacional de consulta evaluado: ${cost}`);
}
});
export const server = new ApolloServer({
typeDefs,
resolvers,
introspection: process.env.NODE_ENV !== 'production', // Deshabilitar introspección en prod
validationRules: [
depthLimit(6), // Máxima profundidad permitida: 6 niveles
complexityRule
]
});
Al interponer estas reglas de validación antes de la fase de resolución de campos, cualquier consulta abusiva es rechazada en microsegundos sin tocar la base de datos.
Protocolo de Hardening para Despliegues GraphQL
Para garantizar la resiliencia integral de servicios GraphQL:
- Implementación de Dataloaders: Agrupa y almacena en caché las lecturas a bases de datos para resolver el problema N+1.
- Lista Blanca de Consultas (Persisted Queries): Permite en producción únicamente consultas pre-compiladas y registradas con hashes criptográficos.
- Validación de Schemas de Entrada: Verifica los tipos y argumentos JSON de entrada utilizando nuestro Validador de JSON y Estructuras.
- Protección de Tokens de Autenticación: Valida los encabezados de autorización según las pautas de JWT ES256 vs RS256 en Microservicios.
- Mitigación de Inyecciones en Resolvers: Aplica sanitización de parámetros conforme a Prevención de Inyecciones SQL en APIs.
Limitación de Tasa Basada en Costes de GraphQL (Cost-Based Rate Limiting)
Los limitadores de tasa tradicionales basados en contar peticiones HTTP por minuto (100 req/min) resultan inútiles en GraphQL, ya que una sola petición con complejidad calculada de 5,000 puntos puede causar más degradación que miles de peticiones simples de 1 punto.
El enfoque moderno de Cost-Based Rate Limiting descuenta del saldo de tokens del cliente el coste real evaluado por el motor de validación. Al consumir su cuota por segundo, el cliente recibe un encabezado 429 Too Many Requests acompañado de la cabecera Retry-After.
Middleware de Rate Limiting por Coste en Express / Fastify
import { Request, Response, NextFunction } from 'express';
interface ClientQuota {
tokensRemaining: number;
lastRefill: number;
}
const clientBuckets = new Map<string, ClientQuota>();
const REFILL_RATE_PER_SEC = 50;
const MAX_CAPACITY = 1000;
export function costRateLimiter(clientIp: string, calculatedCost: number): boolean {
const now = Date.now();
let bucket = clientBuckets.get(clientIp);
if (!bucket) {
bucket = { tokensRemaining: MAX_CAPACITY, lastRefill: now };
clientBuckets.set(clientIp, bucket);
}
const elapsedSecs = (now - bucket.lastRefill) / 1000;
bucket.tokensRemaining = Math.min(MAX_CAPACITY, bucket.tokensRemaining + elapsedSecs * REFILL_RATE_PER_SEC);
bucket.lastRefill = now;
if (bucket.tokensRemaining >= calculatedCost) {
bucket.tokensRemaining -= calculatedCost;
return true;
}
return false;
}
Eliminación de Vulnerabilidades de Batching y Amplificación
Para proteger los endpoints contra ataques de inundación por arrays masivos, los proxies perimetrales deben limitar la cantidad máxima de operaciones empaquetadas en una única carga HTTP y forzar tiempos de espera estrictos en los resolvers de base de datos.
Conclusión
La potencia y flexibilidad de GraphQL requieren un modelo de seguridad adaptado a su naturaleza dinámica. Establecer límites de profundidad de árbol, análisis de costes computacionales y persistencia de consultas transforma un servidor expuesto en una pasarela de datos altamente protegida.
Normativas y Referencias:
- OWASP API Security Top 10: API4:2023 Unrestricted Resource Consumption.
- GraphQL Foundation: Security Best Practices for Production Systems.
- Análisis TecnoCrypter: Validación Segura de Tokens en Arquitecturas SPA.


