mediumCWE-770A04:2021

Sin Paginación en Endpoints de Datos

Endpoints de API que devuelven todos los registros coincidentes sin paginación ni límite, permitiendo a los atacantes volcar tablas completas y causando problemas de memoria/rendimiento bajo carga normal.

Cómo Funciona

Sin LIMIT, `SELECT * FROM users` en una tabla con 10 millones de registros intentará cargar los 10 millones en memoria y devolverlos en una sola respuesta. Incluso con unos pocos miles de registros, esto bloquea el hilo de tu servidor, agota la memoria y filtra todo tu dataset a cualquiera que llame el endpoint.

Código Vulnerable
// MAL: sin LIMIT en la query
export async function GET() {
  const users = await db.users.findMany(); // devuelve TODOS los usuarios
  return Response.json(users);
}
Código Seguro
// BIEN: enforce paginación con cursor u offset
export async function GET(req: Request) {
  const { searchParams } = new URL(req.url);
  const cursor = searchParams.get('cursor');
  const limit = Math.min(parseInt(searchParams.get('limit') ?? '20'), 100);
  const users = await db.users.findMany({
    take: limit,
    cursor: cursor ? { id: cursor } : undefined,
    orderBy: { id: 'asc' }
  });
  return Response.json(users);
}

Ejemplo Real

El endpoint /api/customers de un producto SaaS no tenía paginación. Un competidor escribió un script para llamarlo repetidamente (devolvía todos los clientes de una vez por una cláusula WHERE faltante), descargó toda la lista de clientes y la usó para poaching competitivo.

Cómo Prevenirlo

  • Siempre aplica un LIMIT/take máximo a las queries de base de datos en los endpoints de API
  • Implementa paginación basada en cursor o en offset para endpoints de lista
  • Deja que los llamadores controlen el tamaño de página pero enforce un máximo (ej. 100 registros)
  • Nunca expongas endpoints que puedan devolver conjuntos de resultados sin límite

Tecnologías Afectadas

nodejsNext.jsPythonGo

Data Hogo detecta esta vulnerabilidad automáticamente.

Escanea Tu Repo Gratis

Vulnerabilidades Relacionadas